Asp.netCore RESTful WebApi 小結

上篇文章記錄了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 }
View Code

      例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;}
View Code

    片斷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 }
View Code

    片斷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 }
View Code

    片斷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 }
View Code

    片斷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         }
View Code

    片斷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         }
View Code

  總結:記錄下我的的學習Asp.netCore RESTful WebApi的過程,不對之處歡迎指正。另:對於Controller層WebApi返回值的梳理建議參考官網文檔(https://docs.microsoft.com/zh-cn/aspnet/core/web-api/action-return-types?view=aspnetcore-3.1

相關文章
相關標籤/搜索