سیستم مسیریابی در WebAPI

سه شنبه 13 مرداد 1394

در WebAPI تمام درخواستهای http تحت سیستم مسیریابی (Routing System) است که مدیریت درخواستها را تصمیم گیری می نماید. هدف اصلی از سیستم مسیریابی برای تصمیم گیری و پاسخ به این سوال می باشد : چه متدی از کدام کنترل بهتر است تا آن درخواست را انجام دهد؟

سیستم مسیریابی در WebAPI

هنگامی که ما یک برنامه ساده از نوع WebAPI ایجاد می کنیم template مانند زیر به صورت خودکار یک Route (مسیر) پیش فرض برای ما تولید می کند :

    namespace route_routeprifx {  
        public static class WebApiConfig {  
            public static void Register(HttpConfiguration config) {  
      
                config.MapHttpAttributeRoutes();  
      
                config.Routes.MapHttpRoute(  
                name: "DefaultApi",  
                routeTemplate: "api/{controller}/{id}",  
                defaults: new {  
                    id = RouteParameter.Optional  
                });  
            }  
        }  
    }   

 

متد config.Routes.MapHttpRoute شامل 3 پارامتر زیر می باشد :

1- نام مسیر ("DefaultApi")

2- مسیر Template : یک Template همراه با API و 2 placeholder (کنترلر و id)

3-مقدار پیش فرض : در این مورد، Id در درخواست اجباری نمی باشد.

 

اگر شما از MVC استفاده می کنید شما شباهت های زیادی پیدا خواهید کرد. در MVC یک متد برای قالب مسیریابی وجود دارد اما در اینجا این متد موجود نیست. این تفاوت اصلی میان 2 سیستم مسیر یابی در WebAPI است.

 

الگوی پیش فرض مسیریابی در یک پروژه MVC یه صورت زیر تعریف می شود :
 


    routes.MapRoute(  
    name: "Default", //route name  
    url: "{controller}/{action}/{id}", //route pattern  
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional} //parameter default values  
    );   

اگر سیستم مسیریابی یک مسیر متناسب با الگوی خود پیدا نکند HTTP 404 برمی گرداند.

برای آنکه تصمیم بگیرد کدام متد صدا زده شود سیسم مسیر یابی باید متد HTTP را آنالیز نماید. اگر ما یک درخواست GET در سرور داشته باشیم اکشن باید چیزی شبیه ()GetResource باشد. اما اگر Post باشد اکشن باید ()PostResource باشد

 

هنگامی که مسیرها را تغییر می دهیم یا مسیر جدیدی در برنامه اضافه می کنیم :
 

 

amespace routwork  
{  
    public static class WebApiConfig  
    {  
        public static void Register(HttpConfiguration config)  
        {  
            // Web API configuration and services  
            // Configure Web API to use only bearer token authentication.  
            config.SuppressDefaultHostAuthentication();  
            config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));  
  
            // Web API routes  
            config.MapHttpAttributeRoutes();  
  
            config.Routes.MapHttpRoute(  
                name: "DefaultApi",  
                routeTemplate: "api/{controller}/{id}",  
                defaults: new { id = RouteParameter.Optional }  
            );  
  
            config.Routes.MapHttpRoute(  
            name: "GetAllEmploye",  
            routeTemplate: "api/values/GetAll",  
            defaults: new { controller = "Values", action = "GetAll", id = UrlParameter.Optional }  
  
            );  
            config.Routes.MapHttpRoute(  
            name: "Getdetail",  
            routeTemplate: "api/values/Getdetail/{id}",  
            defaults: new { controller = "Values", action = "Getdetail", id = UrlParameter.Optional }  
  
            );  
  
            config.Routes.MapHttpRoute(  
            name: "GetEmployeDetailByTest",  
            routeTemplate: "api/values/GetEmployeDetailByTest/{id}",  
            defaults: new { controller = "Values", action = "GetEmployeDetailByTest", id = UrlParameter.Optional }  
  
            );  
  
        }  
    }  
} 

 

در اینجا 3 نام مسیر جدید از همه مسیر های جدید داریم. آنها یکی نیستند و همه Template مسیرها شامل PlaceHolder های متنوع هستند و در همه مسیر ها id اختیاری است.

برای مثال زیر یک کنترلر با نام ValuesController اضافه شده است.

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Net;  
using System.Net.Http;  
using System.Web.Http;  
  
using routwork.Models;  
  
namespace routwork.Controllers  
{  
  
     
    public class ValuesController : ApiController  
    {  
        // GET api/values  
        [HttpGet]  
        [ActionName("GetAll")]  
        
        public List<Employe> GetAllEmploye()  
        {  
            List<Employe> emplist = new List<Employe>();  
            emplist.Add(new Employe  
            {  
  
                Empid = 1,  
                Empname = "atul",  
  
  
            });  
            emplist.Add(new Employe  
            {  
  
                Empid = 2,  
                Empname = "taj",  
  
  
            });  
            return emplist;  
        }  
  
  
        [ActionName ("Getdetail")]  
        public Employe GetEmployeDetail(int id)  
        {  
  
            return new Employe  
            {  
  
                Empid = 1,  
                Empname = "atul"  
  
            };  
  
        }  
  
       
        public Employe GetEmployeDetailByTest(int id)  
        {  
  
            return new Employe  
            {  
  
                Empid = 2,  
                Empname = "taj"  
  
            };  
  
        }  
    }  
}

 

حال خروجی های بدست آمده از url های بالا را مشاهده می کنیم :
 

1- api/values/GetAll :

 

 

 

2- api/values/Getdetail/1 :

 

 

3- api/values/GetEmployeDetailByTest/2 :

 

 

در بالا همه فراخوانی ها از نوع Get هستند. اگر Post بودند با خطاهای زیر مواجه می شدیم :
 

The requested resource does not support http method 'POST'
 

 

ویژگی هایی که همه متدهای HTTP را پشتیبانی می کنند در زیر مشاهده می نمایید :
 

HttpGet

HttpPost

HttpPut

HttpOptions

HttpPatch

HttpDelete

HttpHead

 

نتیجه گیری

در این مقاله نحوه مسیردهی در WebAPI و همچنین تفاوت های موجود در مسیردهی بین MVC و WebAPI را بررسی کردیم.

 
 

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید