上篇文章記錄了WebApi的概念以及簡單的認知WebApi ,今天來探究下它的適用場景以及怎麼去用它。html
先簡單聊一下WebApi與用得比較多的WCF、WebService各自的特色:前端
1、WebService是一種能夠接收從Internet或者Intranet上的其它系統中傳遞過來的請求,輕量級的獨立的通信技術,它的特色有:java
一、基於SOAP協議的,數據格式是XML;web
二、web Service 最大的優點即是跨平臺的可互操做性;ajax
三、支持Http協議Xml技術的設備便可擁有而且訪問web Service,但只能部署在IIS上 ;json
四、一些只須要與本機上的其他程序通信的應用程序則不適合用web Service,理由並不是技術上沒法實現,而是消耗過大沒有任何好處。後端
2、WCF是提供統一的,可用於創建安全、可靠的面向服務的應用的高效開發平臺,其特色有:api
一、基於SOAP協議的,數據格式是XML;跨域
二、能夠支持各類各樣的協議,好比TCP,HTTP,HTTPS,Json等;數組
三、與其前輩web Service相比,WCF不只能夠部署在IIS上還能夠部署在應用程序中或者Windows服務中;
四、只要支持標準的web service,能夠跨進程、跨機器甚至於跨平臺的通訊。
3、WebApi的特色:
一、須要經過URI信息來指定端點,每個URI表明1種資源;
二、可經過不一樣的http動做表達不一樣的含義,客戶端使用GET、POST、PUT、DELETE4個表示操做方式的動詞對服務端資源進行操做:GET用來獲取資源,POST用來新建資源(也能夠用於更新資源),PUT用來更新資源,DELETE用來刪除資源;
三、經過請求來實現對資源的資源,資源的表現形式大可能是XML或者HTML(亦或其它),請求的回覆經過Http Status Code表達不一樣含義,而且客戶端能夠經過Accept header來與服務器協商格式,例如但願服務器返回JSON格式仍是XML格式亦或者其餘擴展格式;
四、支持跨平臺、CORS跨域調用WebApi,如經過前端js或者直接在後臺調用它,部署時支持Self-host或者IIS。;
五、客戶端與服務端之間的交互在請求之間是無狀態的,從客戶端到服務端的每一個請求都必須包含理解請求所必需的信息。
聊完它們的特色,那麼如何物盡其用呢?(參考連接:https://blog.csdn.net/u013043518/java/article/details/51793294)
一、當你想建立一個支持消息、消息隊列、雙工通訊的服務時,你應該選擇WCF
二、當你想建立一個服務,能夠用更快速的傳輸通道時,像TCP、NamedPipes或者甚至是UDP(在WCF4.5中),在其餘傳輸通道不可用的時候也能夠支持HTTP。
三、當你想建立一個基於HTTP的面向資源的服務而且可使用HTTP的所有特徵時(好比URIs、request/response頭,緩存,版本控制,多種內容格式),你應該選擇WebAPI
四、當你想讓你的服務用於瀏覽器、手機、iPhone和平板電腦時,你應該選擇Web API
前面在聊WebApi特色的時候有提到能夠經過前端或者在後臺去調用它,看下具體如何調用:
例1: 經過HttpClient類調Api。在Web API發佈的同時,.NET提供了兩個程序集:System.Net.Http和System.Net.Http.Formatting。這兩個程序集中最核心的類是HttpClient (在這裏只討論如何調WebApi,思路爲打磨一個通用的工具類,其他部分各位看官自由發揮):
1 public class CallAPI 2 { 3 private static string uri = "http://localhost:5000/"; 4 private HttpClient client = new HttpClient(); 5 6 /// <summary> 7 /// 簡單查詢 8 /// </summary> 9 /// <param name="resource">目標資源</param> 10 public void GetData(string resource) 11 { 12 client.BaseAddress = new Uri(uri); 13 14 // 爲JSON格式添加一個Accept報頭 15 client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 16 HttpResponseMessage responseMessage = client.GetAsync(resource).Result;//獲取查詢結果 17 if (responseMessage.IsSuccessStatusCode) 18 { 19 var ds = responseMessage.Content.ReadAsStringAsync().Result; 20 string content = JsonConvert.SerializeObject(ds, Newtonsoft.Json.Formatting.Indented);//轉換爲你想要的格式如xml,json等,定義通用的轉換類這裏就不介紹了,請自行打造 21 } 22 } 23 24 /// <summary> 25 /// 帶參查詢 26 /// </summary> 27 /// <param name="resource">目標資源</param> 28 /// <param name="id">ID</param> 29 public void GetDataWithParam(string resource) 30 { 31 client.BaseAddress = new Uri(uri); 32 33 client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 34 HttpResponseMessage responseMessage = client.GetAsync(resource).Result; 35 if (responseMessage.IsSuccessStatusCode) 36 { 37 var ds = responseMessage.Content.ReadAsStringAsync().Result; 38 string content = JsonConvert.SerializeObject(ds, Newtonsoft.Json.Formatting.Indented); 39 } 40 41 } 42 43 44 /// <summary> 45 /// put請求更新資源 46 /// </summary> 47 /// <param name="resource"></param> 48 /// <returns></returns> 49 public bool PutData(string resource) 50 { 51 bool bol = false; 52 //建立和webapi對應的類 53 var content = new FormUrlEncodedContent(new Dictionary<string, string>() 54 { 55 {"ID","382accff-57b2-4d6e-ae84-a61e00a3e3b5"}, 56 {"Name","Name" }, 57 {"QZH","111"} 58 }); 59 HttpResponseMessage response = client.GetAsync(resource).Result; 60 response = client.PostAsync(resource, content).Result; 61 if (response.IsSuccessStatusCode) 62 { 63 bol = true; 64 var result = response.Content.ReadAsStringAsync().Result; 65 } 66 return bol; 67 } 68 69 }
例2:基於mvc+dotnet core WebApi,經過前端ajax來調用,下面直接貼幾段不一樣調用類型的代碼(因爲Put 請求與Post請求相似就再也不舉例貼代碼):
片斷1:基礎類型做爲參數
1 前端ajax代碼: 2 $.ajax({ 3 type: "get", 4 url: "http://localhost:27221/api/Charging/GetAllChargingData", 5 data: { id: 1, name: "Jim", bir: "1988-09-11"}, 6 success: function (data, status) { 7 if (status == "success") { 8 $("#div_test").html(data); 9 } 10 } 11 }); 12 Controller層代碼: 13 [HttpGet] 14 public string GetAllChargingData(interestingid,string name, DateTime bir) 15 {return "ChargingData" + id;}
片斷2:實體類型做爲參數
1 前端ajax代碼: 2 $.ajax({ 3 type: "get", 4 url: "http://localhost:27221/api/Charging/GetByModel", 5 contentType: "application/json", 6 data: { strQuery: JSON.stringify({ ID: "1", NAME: "Jim", CREATETIME: "1988-09-11" }) }, 7 success: function (data, status) { 8 if (status == "success") { 9 $("#div_test").html(data); 10 } 11 } 12 }); 13 Controller層代碼一(先序列化,再在後臺反序列的方式): 14 [HttpGet] 15 public string GetByModel(string strQuery) 16 { 17 TB_CHARGING oData=Newtonsoft.Json.JsonConvert.DeserializeObject<TB_CHARGING>(strQuery)); 18 return "Charging" + oData.ID; 19 } 20 Controller層代碼二(在參數裏面加上[FromUri]): 21 [HttpGet] 22 [HttpGet] 23 public string GetAllChargingData([FromUri]TB_CHARGING obj) 24 { 25 return "ChargingData" + obj.ID; 26 }
片斷3:單個實體做爲參數:(post請求默認是將表單裏面的數據的key/value形式發送到服務,而咱們的服務器只須要有對應的key/value屬性值的對象就能夠接收到。而若是使用application/json,則表示將前端的數據以序列化過的json傳遞到後端,後端要把它變成實體對象,還須要反序列化的過程)
1 方法一: (使用post請求的默認參數類型,前端直接傳遞json類型的對象) 2 前端ajax代碼: 3 $.ajax({ 4 type: "post", 5 url: "http://localhost:27221/api/Charging/SaveData", 6 data: { ID: "1", NAME: "Jim", CREATETIME: "1988-09-11" }, 7 success: function (data, status) {} 8 }); 9 方法二:(指定了contentType爲application/json,需序列化待傳遞的對象) 10 前端ajax代碼: 11 var postdata = { ID: "1", NAME: "Jim", CREATETIME: "1988-09-11" }; 12 $.ajax({ 13 type: "post", 14 url: "http://localhost:27221/api/Charging/SaveData", 15 contentType: 'application/json', 16 data: JSON.stringify(postdata), 17 success: function (data, status) {} 18 }); 19 Controller層代碼: 20 [HttpPost] 21 public bool SaveData(TB_CHARGING oData) 22 { 23 return true; 24 }
片斷4:實體和基礎類型一塊兒做爲參數傳遞
1 前端ajax代碼: 2 var postdata = { ID: "1", NAME: "Jim", CREATETIME: "1988-09-11" }; 3 $.ajax({ 4 type: "post", 5 url: "http://localhost:27221/api/Charging/SaveData", 6 contentType: 'application/json', 7 data: JSON.stringify({ NAME:"Lilei", Charging:postdata }), 8 success: function (data, status) {} 9 }); 10 Controller層代碼: 11 [HttpPost] 12 public object SaveData(dynamic obj) 13 { 14 var strName = Convert.ToString(obj.NAME); 15 var oCharging = Newtonsoft.Json.JsonConvert.DeserializeObject<TB_CHARGING>(Convert.ToString(obj.Charging)); 16 return strName; 17 }
片斷5:基礎類型數組做爲參數傳遞
1 前端ajax代碼: 2 var arr = ["1", "2", "3", "4"]; 3 $.ajax({ 4 type: "post", 5 url: "http://localhost:27221/api/Charging/SaveData", 6 contentType: 'application/json', 7 data: JSON.stringify(arr), 8 success: function (data, status) { } 9 }); 10 Controller層代碼: 11 [HttpPost] 12 public bool SaveData(string[] ids) 13 { 14 return true; 15 }
片斷6:簡單貼個Delete請求
1 var arr = [ 2 { ID: "1", NAME: "Jim", CREATETIME: "1988-09-11" }, 3 { ID: "2", NAME: "Lilei", CREATETIME: "1990-12-11" }, 4 { ID: "3", NAME: "Lucy", CREATETIME: "1986-01-10" } 5 ]; 6 $.ajax({ 7 type: "delete", 8 url: "http://localhost:27221/api/Charging/OptDelete", 9 contentType: 'application/json', 10 data: JSON.stringify(arr), 11 success: function (data, status) {} 12 }); 13 Controller層: 14 [HttpDelete] 15 public bool OptDelete(List<TB_CHARGING> lstChargin) 16 { 17 return true; 18 }
總結:記錄下我的的學習Asp.netCore RESTful WebApi的過程,不對之處歡迎指正。另:對於Controller層WebApi返回值的梳理建議參考官網文檔(https://docs.microsoft.com/zh-cn/aspnet/core/web-api/action-return-types?view=aspnetcore-3.1)