webapi url

WeinR

New member
webapi url

שלום , אני בונה פרויקט ב webAPI שאני מתחברת אליו מ webservice אחר . אני חיבת(הסבר ארוך למה) את ה URL של ה WEBAPI שלי שיהיה בצורה הזו: לדוגמא:
http://localhost:51923/api/client/?client=12
ז"א השם של הפונקציה
ואז ? - סימן שאלה
שם הפרמטר
ואז הערך
וה URL הבסיסי שלי הוא:http://localhost:51923/api
כיון שיש לי הרבה שמות של פונקציות ...
מקוה שהיתי ברורה ותודה על כל תשובה.
 

WeinR

New member
מנסה שוב...

בקונטרולר שלי יש פונקציה שקוראים לה client שמקבלת כפרמטר client שהוא בעצם Id .
ומעליה רשום:
[HttpGet]
[Route("api/client/{client}")]
אם אני רוצה לפנות לפונקציה זו , למשל דרך הדפדפן, אז אני ארשום כך:
http://localhost:51923/api/client/=12
שזה אומר
שם הפונציה/והערך של הפרמטר
אני רוצה שהפניה לפונצקיה תהיה כך:
http://localhost:51923/api/client/?client=12
ניסיתי כבר לבנות webservice של soap אבל יש לי שם בעיה עם ovverloding עם השמות של הפונקציה. אז אני מנסה לעשותא ת זה ב webapi
אבל כעת יש לי בעיה עםה הurl
 

ziv1f

New member
אם אני מבין נכון, זו בעיית routing

כלומר, ה-API שלך מקבל בקשה דרך URL מסויים, וצריך בעצם קוד (או אם יש משהו מוכן אז כמובן עדיף) שיחליט בעצם איזה פונקציה צריך לבצע בהתאם ל-URL. מי שמבצע את זה כברירת מחדל ב-MVC (ש-WebAPI הוא חלק ממנו) זה מנגנון הראוטינג, ויש לו כברירת מחדל כללים מסויימים וכמובן גם אפשרויות לקסטם אותו, וגם אפשרויות להחליף אותו במנגנון קבלת-החלטות משלך.

http://codeclimber.net.nz/archive/2...vc-extensibility-points-you-have-to-know.aspx

בברכה,
זיו
 

nocgod

New member
כמה הערות

בחיים שלי לא ראיתי לינק שדומה ללינק הראשון שלך - ואני מתכנת דוטנט...
לגבי הלינק השני - אמור לעבוד בהנתן חתימה נכונה של ה action.
הפרקטיקה שלי היא להפוך את ה id של היישות אותה אתה מחפש חלק מה URL ולא חלק מהquery params

כדי לגשת נכון תיגש ל api/clients/12 כאשר הפונקציה שלך נראת ככה:
קוד:
[RoutePrefix("api/[controller]")]
public class ClientsController : ApiController
	{
	[Route("{clientId}")]
	public Client GetClient(int clientId)
	{
		return _myDatabase.Clients.SingleOrDefault(c => c.Id == clientId);
	}
}

בכל מקרה - כדאי לך לקחת איזה קורס של פלורלסייט או קרוא כמה וכמה בלוגפוסטים כדי להבין איך עובד כל העיניין של routes ב WebApi ואיך עובד כל הסיפור של ה Binding של הפרמטרים לaction
 

Miki Watts

New member
המבנה של ה URL הוא ערבוב של web api ו default page

יש תכונה ב IIS שאם הגדרת default page ולא כתבת את שם הדף asp , אז ה query string יעבור לאותו default page. זה משהו שהיה קיים עד IIS 6 ובוטל ב IIS 7.
&nbsp
בכל מקרה URL כמו בהודעה המקורית הוא לא תקין כי ב web api אין default page ואין משהו שיקבל את ה query string.
&nbsp
הדבר היחיד שאני יכול לחשוב עליו זה להכניס hard coded את ה ? ב route, אם זה יעבוד בכלל.
 

nocgod

New member
לא הבנתי בכלל על מה אתה מדבר בתחלס...

הבחור שאל שאלה פשוטה - לא ידע להתאים בין ה route attributes שצריכים לשבת על ה controller וה action לבין איך צריך להראות ה URL שאליו הוא (כנראה) עושה GET.

קוד:
[RoutePrefix("api/clients")]
public class ClientsController : ApiController
{
	// this action will be called when you GET /api/clients?clientId=12
	[HttpGet, Route("")]
	public async Task<Client> GetClientFromQuery(int clientId)
	    => await_myDatabase.Clients.SingleOrDefaultAsync(c => c.Id == clientId);
	
	
	// this action will be called when you GET /api/clients/12
	[HttpGet, Route("{clientId}")]
	public async Task<Client> GetClientFromUrl(int clientId)
	    => await _myDatabase.Clients.SingleOrDefaultAsync(c => c.Id == clientId);
}
 
אני אנסה להסביר

דבר ראשון נדבר על הראוטינג.

נניח שיש לך קלינט עם ID 12 ואת רוצה לקבל את הפרטים עליו. יש שני דרכים לעשות ראוטינג כזה.
אחת שאת תצטרכי לפנות ל-URL הבא::
api/clients/12
השני:
api/clients/?id=12

מה ההבדל? דבר ראשון אין הבדל משמעותי.
מה כן ההבדל? בדוגמא הראשונה ה-ID הוא חלק מה-PATH של ה-URL. בדוגמה השניה הפרמטר הוא פרמטר שמוסיפים אותו ל-PATH. לפי החוקים הרשמיים של REST הדוגמה הראשונה היא הנכונה. האם את חייבת לעמוד בהם? לא. תבחרי את מה שנוח לך.

עכשיו לגבי WEBAPI.
אם את רוצה לממש את הדוגמה הראשונה שציינתי את צריכה לכתוב בראוטינג:
[Route("api/clients/{clientId}")]
והחתימה של הפונקציה צריכה להיות כך:
public async Task GetClient(int clientID)
אם את רוצה לממש את הדוגמה השניה שציינתי את צריכה לכתוב בראוטינג:
[Route("api/clients/")]
והחתימה של הפונקציה צריכה להיות כך:
public async Task GetClient([FromUri]int clientID)

אם תעשי את הדוגמה הראשונה אני חושב שאפשר להשמיט את ראוטינג וזה יהיה הראוטינג הדיפולטיבי של הפונקציה.
 

Miki Watts

New member
זה משהו שלא הכרתי, שימושי לעתיד

 

nocgod

New member
2 פני - העדפות שלי נטו

אני תמיד אוהב לכתוב route - לא רוצה להשאיר עבודת ניחוש לroute mapper הוא לא תמיד עושה עבודה טובה. אני מניח שאני סתם קיצוני, אבל מאוד סבלתי בעבר מה template route mapper כנראה משם הקיצוניות.

אחלה תשובה BTW :)
 
למעלה