c# 進階之 WebAPI

c# 進階之 WebAPI

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;

}
}
發佈了18 篇原創文章 · 獲贊 26 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章