ASP.NET Web API - قسمت چهارم
نویسنده: بهروز راد
تاریخ: ۱۳۹۱/۰۴/۱۹ ۱۱:۱۵
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
در ذیل، مثال هایی را از چند آدرس درخواستی و نتیجهی حاصل از فراخوانی آنها مشاهده میکنید.
در آدرس اول، عبارت "products" به ProductsController تطبیق پیدا میکند. درخواست نیز از نوع GET است، بنابراین Web API به دنبال متدی در Controller میگردد که نام آن با عبارت GET "آغاز" شده باشد. همچنین، آدرس شامل قسمت {id} نیز نیست. بنابراین، Web API متدی را انتخاب میکند که پارامتر ورودی ندارد. متد GetAllProducts در ProductsController، تمامی این شروط را دارد، پس انتخاب میشود.
در دومین آدرس، همان حالت قبل وجود دارد، با این تفاوت که در آدرس درخواستی، قسمت {id} وجود دارد. از آنجا که نوع قسمت {id} در متد int ،GetProductById تعریف شده است، باید یک عدد صحیح بعد از آدرس /api/products وجود داشته باشد تا متد GetProductById فراخوانی شود. این عدد به طور خودکار به نوع int تبدیل شده و در پارامتر اول متد GetProductById قرار میگیرد. در ذیل، برخی آدرسها را ملاحظه میکنید که معتبر نیستند و باعث بروز خطا میشوند.
در آدرس اول، Client یک درخواست از نوع POST ارسال کرده است. Web API به دنبال متدی میگردد که نام آن با عبارت Post آغاز میشود. اما متدی با این شرط در ProductsController وجود ندارد. بنابراین، پاسخی که دریافت میشود، عبارت "405 Method Not Allowed" است. درخواست برای آدرس /api/users/ نیز معتبر نیست، چون Controllerیی با نام UsersController وجود ندارد. و سومین آدرس نیز بدین دلیل نامعتبر است که قسمت abc نمیتواند به یک عدد صحیح تبدیل شود.
اگر قسمت Response body را انتخاب کنید، پاسخ دریافت شده در قالب JSON را خواهید دید.
سلام آقای راد
با تشکر از زحمتی که میکشید. فرمودید که :
"بنابراین web api به دنبال متدی در controller میگردد که نام آن با عبارت get "آغاز" شده باشد. "
آیا این کار باعث عدم دقت و ایجاد خطاهای ناخواسته نمیشه؟ این فقط متدی با get شروع بشه شاید برای من که خیلی کم mvc کار کردم یکم مشکل دار به نظر برسه.اگر ما دو متد داشته باشیم که در ابتدای آنها get باشد آیا برنامه خطا میگیرد؟ ممنون میشم یکم در این باره توضیح بدین
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
[HttpGet]
public string Details(int id)
{
// do something
}
$.getJSON("api/products/"+id,
function (data) {
var str = data.Name + ' ' + data.Price;
$('#products').empty();
$('#products').html(str);
}
); [Authorize(Roles="Admin")]
//[Authorize(Users="")]
public Product GetProductById(int Id)
{
var product = Products.FirstOrDefault(p => p.Id == Id);
if(product==null)
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
return product;
}