1.在建立WebApi中默認的路由規則,只能知足通常簡單的RESTful風格,如 api/Products/{id}。javascript
可是在實際運用中很難嚴格知足RESTful要求的WebApi。所以須要使用高版本的WebApi2。至少對應版本.net4.5.html
2.REST這個詞,即Representational State Transfer的縮寫,是Roy Thomas Fielding在他2000年的博士論文中提出的。REST的名稱"表現層狀態轉化"中,省略了主語。"表現層"其實指的是"資源"(Resources)的"表現層"。java
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用來刪除資源。api
3.知足RESTful風格要求:跨域
a)應該將API的版本號放入URL。例如:https://api.example.com/v1/,或將版本號放在HTTP頭信息中,但不如放入URL方便和直觀。Github採用這種作法。
服務器
b)在RESTful架構中,每一個網址表明一種資源(resource),因此網址中不能有動詞,只能有名詞,並且所用的名詞每每與數據庫的表格名對應。通常來講,數據庫中的表都是同種記錄的"集合"(collection),因此API中的名詞也應該使用複數。例如:https://api.example.com/v1/animalsrestful
c)對於資源的具體操做類型,由HTTP動詞表示。 網絡
不經常使用的HTTP動詞:
d)若是記錄數量不少,服務器不可能都將它們返回給用戶。API應該提供參數,過濾返回結果。
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