در این قسمت با نحوهی تناظر آدرسها توسط Web API به متدهای موجود در Controller آشنا میشوید.
در هر درخواستی که ارسال میشود، Web API، انتخاب Controller مناسب را با رجوع به جدولی با نام جدول مسیرها انجام میدهد. زمانی که یک پروژهی جدید با استفاده از ASP.NET MVC 4 ایجاد میکنید، یک route پیش فرض به صورت ذیل در متد RegisterRoutes قرار میگیرد.
routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } );
- {controller} به نام Controller تناظر پیدا میکند.
- نوع درخواست ارسالی (GET، POST، PUT، DELETE) به نام متد تناظر پیدا میکند.
- اگر قسمت {id} در آدرس وجود داشته باشد، به پارامتر id متد انتخاب شده پاس داده میشود.
- اگر آدرس دارای Query String باشد، به پارامترهای همنام خود در متد، تناظر پیدا میکنند.
در ذیل، مثال هایی را از چند آدرس درخواستی و نتیجهی حاصل از فراخوانی آنها مشاهده میکنید.
- آدرس api/products/ با نوع درخواست GET به متد ()GetAllProducts
- آدرس api/products/1/ با نوع درخواست GET به متد (1)GetProductById
- آدرس api/products?category=hardware/ با نوع درخواست GET به متد ("GetProductByCategory("hardware
در آدرس اول، عبارت "products" به ProductsController تطبیق پیدا میکند. درخواست نیز از نوع GET است، بنابراین Web API به دنبال متدی در Controller میگردد که نام آن با عبارت GET "آغاز" شده باشد. همچنین، آدرس شامل قسمت {id} نیز نیست. بنابراین، Web API متدی را انتخاب میکند که پارامتر ورودی ندارد. متد GetAllProducts در ProductsController، تمامی این شروط را دارد، پس انتخاب میشود.
در دومین آدرس، همان حالت قبل وجود دارد، با این تفاوت که در آدرس درخواستی، قسمت {id} وجود دارد. از آنجا که نوع قسمت {id} در متد int ،GetProductById تعریف شده است، باید یک عدد صحیح بعد از آدرس /api/products وجود داشته باشد تا متد GetProductById فراخوانی شود. این عدد به طور خودکار به نوع int تبدیل شده و در پارامتر اول متد GetProductById قرار میگیرد. در ذیل، برخی آدرسها را ملاحظه میکنید که معتبر نیستند و باعث بروز خطا میشوند.
- آدرس api/products/ با نوع درخواست POST، باعث خطای 405Method Not Allowed میشود.
- آدرس api/users/ با نوع درخواست GET، باعث خطای 404Not Found میشود.
- آدرس api/products/abc/ با نوع درخواست GET، باعث خطای 400Bad Request میشود.
در آدرس اول، Client یک درخواست از نوع POST ارسال کرده است. Web API به دنبال متدی میگردد که نام آن با عبارت Post آغاز میشود. اما متدی با این شرط در ProductsController وجود ندارد. بنابراین، پاسخی که دریافت میشود، عبارت "405 Method Not Allowed" است. درخواست برای آدرس /api/users/ نیز معتبر نیست، چون Controllerیی با نام UsersController وجود ندارد. و سومین آدرس نیز بدین دلیل نامعتبر است که قسمت abc نمیتواند به یک عدد صحیح تبدیل شود.
زمانی که با یک وب سرویس کار میکنید، مشاهدهی محتویات درخواست ارسالی و پاسخ دریافتی میتواند کاربرد زیادی در درک نحوهی تعامل بین Client و وب سرویس و کشف خطاهای احتمالی داشته باشد. در Firefox با استفاده از افزونهی Firebug و در Internet Explorer 9 به بالا با ابزار Developer Tools آن میتوان درخواستها و پاسخها را مشاهده کرد. در Internet Explorer، کلید F12 را برای اجرای Developer Tools فشار دهید. از قسمت Network بر روی دکمهی Start Capturing کلیک کنید. حال کلید F5 را برای بارگذاری مجدد صفحه فشار دهید. Internet Explorer، درخواست و پاسخ رد و بدل شده بین مرورگر و Web Server را مانیتور کرده و گزارشی را نشان میدهد (شکل ذیل).
از ستون URL، آدرس /api/products/ را انتخاب و بر روی دکمهی Go to detailed view کلیک کنید. در قسمتی که باز میشود، گزینه هایی برای مشاهدهی هدرهای درخواست، پاسخ و همچنین بدنهی هر یک وجود دارد. به عنوان مثال، اگر قسمت Request headers را انتخاب کنید، خواهید دید که Internet Explorer از طریق هدر Accept، تقاضای پاسخ در قالب JSON را کرده است (شکل ذیل).
اگر قسمت Response body را انتخاب کنید، پاسخ دریافت شده در قالب JSON را خواهید دید.