C# WebApi使用AttributeRoutes特性路由


1.在創建WebApi中默認的路由規則,只能滿足一般簡單的RESTful風格,如 api/Products/{id}。

   但是在實際運用中很難嚴格滿足RESTful要求的WebApi。因此需要使用高版本的WebApi2。至少對應版本.net4.5.

2.REST這個詞,即Representational State Transfer的縮寫,是Roy Thomas Fielding在他2000年的博士論文中提出的。REST的名稱"表現層狀態轉化"中,省略了主語。"表現層"其實指的是"資源"(Resources)的"表現層"。

  Resources:就是網絡上的一個實體,或者說是網絡上的一個具體信息。它可以是一段文本、一張圖片、一首歌曲、一種服務,總之就是一個具體的實在。你可以用一個URI(統一資源定位符)指向它,每種資源對應一個特定的URI。要獲取這個資源,訪問它的URI就可以,因此URI就成了每一個資源的地址或獨一無二的識別符。

  Representation:信息實體(資源)的表現形式,可以用txt格式表現,也可以用HTML格式、XML格式、JSON格式表現,甚至可以采用二進制格式;圖片可以用JPG格式表現,也可以用PNG格式表現。

  State Transfer:代表了客戶端和服務器的一個互動過程。在這個過程中,勢必涉及到數據和狀態的變化。互聯網通信協議HTTP協議,是一個無狀態協議。這意味着,所有的狀態都保存在服務器端。因此,如果客戶端想要操作服務器,必須通過某種手段,讓服務器端發生"狀態轉化"(State Transfer)。而這種轉化是建立在表現層之上的,所以就是"表現層狀態轉化"。客戶端用到的手段,只能是HTTP協議。具體來說,就是HTTP協議里面,四個表示操作方式的動詞:GET、POST、PUT、DELETE。它們分別對應四種基本操作:GET用來獲取資源,POST用來新建資源(也可以用於更新資源),PUT用來更新資源,DELETE用來刪除資源。

3.滿足RESTful風格要求:

   a)應該將API的版本號放入URL。例如:https://api.example.com/v1/,或將版本號放在HTTP頭信息中,但不如放入URL方便和直觀。Github采用這種做法。

   b)在RESTful架構中,每個網址代表一種資源(resource),所以網址中不能有動詞,只能有名詞,而且所用的名詞往往與數據庫的表格名對應。一般來說,數據庫中的表都是同種記錄的"集合"(collection),所以API中的名詞也應該使用復數。例如:https://api.example.com/v1/animals

  c)對於資源的具體操作類型,由HTTP動詞表示。   

  • GET(SELECT):從服務器取出資源(一項或多項)。
  • POST(CREATE):在服務器新建一個資源。
  • PUT(UPDATE):在服務器更新資源(客戶端提供改變后的完整資源)。
  • PATCH(UPDATE):在服務器更新資源(客戶端提供改變的屬性)。
  • DELETE(DELETE):從服務器刪除資源。

      不常用的HTTP動詞:     

  • HEAD:獲取資源的元數據。
  • OPTIONS:獲取信息,關於資源的哪些屬性是客戶端可以改變的。

  d)如果記錄數量很多,服務器不可能都將它們返回給用戶。API應該提供參數,過濾返回結果。

  • ?limit=10:指定返回記錄的數量
  • ?offset=10:指定返回記錄的開始位置。
  • ?page=2&per_page=100:指定第幾頁,以及每頁的記錄數。
  • ?sortby=name&order=asc:指定返回結果按照哪個屬性排序,以及排序順序。
  • ?animal_type_id=1:指定篩選條件

  e)服務器返回的數據格式,應該盡量使用JSON,避免使用XML。

4.使用AttributeRoutes特性路由

  1》 需要在APP_START里的WebApiConfig.cs的Register方法中添加一行:config.MapHttpAttributeRoutes();

  

 public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
           
            // 啟用Web API特性路由
            config.MapHttpAttributeRoutes();


            //config.Routes.MapHttpRoute(
            //    name: "DefaultApi",
            //    routeTemplate: "api/{controller}/{id}",
            //    defaults: new { id = RouteParameter.Optional }
            //);
        }
    }

若:MapHttpAttributeRoutes有小紅線報錯,是因為:特性路由只在WebAPI 2中。解決方法:

NuGet package manager--->package manager console,輸入如下命令:

Install-Package Microsoft.AspNet.WebApi.WebHost

重啟VS

2》將Global.asax文件中WebApiConfig注釋。

 public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            GlobalConfiguration.Configure(WebApiConfig.Register);

            //WebApiConfig.Register(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            
        }

     
    }

3》創建WebApi TestController.cs文件.

如果想給某個API控制器中的所有Action加上一個前綴,可把RoutePrefix特性打在API控制器上。
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Web.Http;

namespace API.Controllers.v1
{
    [RoutePrefix("api/v1")]
    public class TestController : ApiController
    {

        [HttpGet]
        [Route("Test/{id}/{no}}")]
        [CrossDomain]
        public HttpResponseMessage Get(string userName, string no)
        {
            return "";
        }

        [HttpPost]
        [Route("Test")]
        [CrossDomain]
        public int Test([FromBody] dynamic JsonData)
        {
            return 0;
        }
    }
}

其中CrossDomain屬性是跨域請求屬性。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http.Filters;

namespace API.CustomFilter
{
    public class CrossDomainAttribute:ActionFilterAttribute
    {
        private const string Origin = "Origin";

        private const string AccessControlAllowOrigin = "Access-Control-Allow-Origin";

        private const string originHeaderdefault = "*";

        public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
        {
            //base.OnActionExecuted(actionExecutedContext);
            actionExecutedContext.Response.Headers.Add(AccessControlAllowOrigin,originHeaderdefault);
        }
    }
}

下面的表格列出了支持的約束

約束 介紹 示例
alpha 匹配大寫或小寫字母 (a-z, A-Z) {x:alpha}
bool   {x:bool}
datetime   {x:datetime}
decimal   {x:decimal}
double   {x:double}
float 匹配一個 32位浮點數 {x:float}
guid   {x:guid}
int   {x:int}
length 匹配一個長度在指定范圍內的字符串 {x:length(6)}
{x:length(1,20)}
long   {x:long}
max 匹配指定了最大值的整數 {x:max(10)}
maxlength 匹配指定了最大長度字符串 {x:maxlength(10)}
min 匹配指定了最小值的整數 {x:min(10)}
minlength 匹配指定了最小長度字符串 {x:minlength(10)}
range 匹配指定了大小區間的整數 {x:range(10,50)}
regex 匹配一個正則表達式 {x:regex(^\d{3}-\d{3}-\d{4}$)}

 如果要指定多個約束,需要用冒號間隔 [Route("users/{id:int:min(1)}")]

 

相關文檔:

http://www.ruanyifeng.com/blog/2014/05/restful_api.html 

http://blog.csdn.net/qingtian12138/article/details/73857018

https://www.cnblogs.com/TiestoRay/p/5755454.html

https://www.cnblogs.com/wenlong7982/p/5713597.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM