REST是設計風格而不是標準。前端
webapi有本身的路由。web
webservice和wcf的協議都是soap協議,數據的序列化和反序列化都是soap的格式。而webapi是Json的數據傳遞ajax
webapi的優勢有哪些?json
(1)很是適合作http的請求,前端與webapi交互特別方便後端
(2)webapi更輕量由於使用的json數據來傳遞。api
(3)webapi不少時候是給前端提供數據的,由於webapi跟控制器關聯的沒那麼緊密(如果沒webapi,用mvc的模式,那麼頁面直接從對應的控制器獲取數據),這樣傳遞數據webapi對,手機,app,頁面均可以經過同一個數據源提供數據,會比較靈活一些。(會跨域)跨域
(一)配置webapi,訪問瀏覽器
第一步:新建項目後,找到Global.asax文件----找到GlobalConfiguration.Configure(WebApiConfig.Register)方法------按F12進入 WebApiConfig.Register方法中----添加內容紅框框mvc
知識點:路由器註冊順序是由上往下的,會先從上面進行匹配。app
路由器的名稱不能重名,不然報錯【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方式:第一種:單個參數
第二種:經過傳實體或實體+參數
******************************以上都是前端的調用****************************************************
*******************************如下是後端的調用*****************************************************
一、後端調用也是經過模擬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; } }