REST是設計風格而不是標准。
webapi有自己的路由。
webservice和wcf的協議都是soap協議,數據的序列化和反序列化都是soap的格式。而webapi是Json的數據傳遞
webapi的優點有哪些?
(1)非常適合做http的請求,前端與webapi交互特別方便
(2)webapi更輕量因為使用的json數據來傳遞。
(3)webapi很多時候是給前端提供數據的,因為webapi跟控制器關聯的沒那么緊密(若是沒webapi,用mvc的模式,那么頁面直接從對應的控制器獲取數據),這樣傳遞數據webapi對,手機,app,頁面都可以通過同一個數據源提供數據,會比較靈活一些。(會跨域)
(一)配置webapi,訪問
第一步:新建項目后,找到Global.asax文件----找到GlobalConfiguration.Configure(WebApiConfig.Register)方法------按F12進入 WebApiConfig.Register方法中----添加內容紅框框
知識點:路由器注冊順序是由上往下的,會先從上面進行匹配。
路由器的名稱不能重名,否則報錯【CustomApi/DefaultApi】
第二步:設置webapi項目為啟動項,然后啟動,在網頁路徑上加api/values(控制器名稱不要Controller)
知識點:因為ValuesController是項目自帶的,那么這一次的請求與 DefaultApi的路由規格是一致的。
但顯示的結果應該Values控制器中的get方法的,也就是應該是訪問api/values/get。實際上api風格是不需要的get,rest也不需要get,會自動找到這個get的。若是把這個路徑放到別的瀏覽器會直接得到json格式的數據
(2)如何去使用webapi?頁面獲取數據通過api提供,不通過控制器
知識點:1.ajax中的type有四種方式:get(查詢),post(修改),delete(刪除),put(插入) 。
2.寫webapi時,在后台的方法最好將特性標記號對應上[HttpGet],[HttpPost],[HttpDelete],[HttpPut]。http請求和rest風格的api如果不想在后台方法寫特性,但也可以將方法名以Get開頭,否則會報錯。
get:若是查詢數據,通過get,其實get請求會將參數拼裝到url上面,而url長度是有限的
post:若是對原有數據新增和修改就用post,多用post即可。post不是將參數放在url上面的,而是放在表單上的。
3.傳遞的參數username名一定要相同,但是大小寫可以不一樣。
4.若是user={name:"張蘇納",id:123,age:'19'} 然后data:user那么在后台是接收不到的,即使在頁面調試時是可以看到數據。若是想接收到的話,需要在后台寫成GetUserModeuri([FormUri]Users user)。
5.基於第4的另一種方法。可以將user序列化轉化為一個字符竄,然后后台接收后反序列化即可得到。data:{userString:JSON.stringify(user)}
6.(1)若是通過post請求的時候,是將數據放在from data里面的,若是傳遞單個參數,不要在ajax上不要寫對應參數。
(2)只有不寫id才能得到,與[formbody]無關。若是通過post傳遞實體,那么在后台可以直接拿到 ,不需要任何轉化。
(3)當然也可以通過data:Json.stringify(user) contentType:'application/json'(contentType默認是json類型的)來在后台同樣得到。
(4)若是參數包含了一個實體,還有一個字符串參數data:{"User":user,"Info":info}該怎么辦,可以通過引用Newtonsoft.Json.Linq的JObject類型。jObject.ToObject是一個序列化方法,將josn轉化為對象。
7.dynamic動態類型,比如一個實體和一個參數放到同一個對象中,獲取對象后,然后dynamic json=jData; var mm= json.user,動態類型是可以直接訪問屬性的。
8.put和post是一樣的使用,put主要是插入數據使用。
9.delete也是一樣的。
10.webapi最方便的是給前端使用。
get方式:單個參數,實體
post方式:第一種:單個參數
第二種:通過傳實體或實體+參數
******************************以上都是前端的調用****************************************************
*******************************以下是后端的調用*****************************************************
1、后端調用也是通過模擬http請求,有兩種方式:HttpClient(4.0才出現),HttpWebRequest(更靈活)
//得到調用該方法就可以得到 HttpClient方式實現get請求 private string GetClient(){string url="http://localhost:9008/api/users/GetUserByName?username=superman"; var handler=new HttpClientHandler(); using(var http=new HttpClient(handler)){ var response=http.GetAsync(url).Result;//拿到異步結果 cw(response.StatusCode);//確保http成功狀態值 //await異步讀取最后的JSON(注意此時gzip已經被自動解壓縮了,因為上面的AutomaticDecompression=DecompressionMethods.G) return response.Content.ReadAsStringAsync().Result; } } //得到調用該方法就可以得到 HttpWebRequest方式 實現get請求 private string GetWebQuest(){ string url="http://localhost:9008/api/users/GetUserByName?username=superman"; HttpWebRequest request using(var http=new HttpClient(handler)){ var response=http.GetAsync(url).Result;//拿到異步結果 cw(response.StatusCode);//確保http成功狀態值 //await異步讀取最后的JSON(注意此時gzip已經被自動解壓縮了,因為上 面的AutomaticDecompression=DecompressionMethods.G) return response.Content.ReadAsStringAsync().Result; } }