主頁 > .NET開發 > Asp.netCore RESTful WebApi 小結

Asp.netCore RESTful WebApi 小結

2020-09-13 05:23:18 .NET開發

上篇文章記錄了WebApi的概念以及簡單的認知WebApi ,今天來探究下它的適用場景以及怎么去用它,

  先簡單聊一下WebApi與用得比較多的WCF、WebService各自的特點:

  一、WebService是一種可以接收從Internet或者Intranet上的其它系統中傳遞過來的請求,輕量級的獨立的通訊技術,它的特點有:

    1、基于SOAP協議的,資料格式是XML;

    2、web Service 最大的優勢便是跨平臺的可互操作性;

    3、支持Http協議Xml技術的設備即可擁有并且訪問web Service,但只能部署在IIS上 ;

    4、一些只需要與本機上的其余程式通訊的應用程式則不適合用web Service,理由并非技術上無法實作,而是消耗過大沒有任何好處,

  二、WCF是提供統一的,可用于建立安全、可靠的面向服務的應用的高效開發平臺,其特點有:

    1、基于SOAP協議的,資料格式是XML;

    2、可以支持各種各樣的協議,比如TCP,HTTP,HTTPS,Json等;

    3、與其前輩web Service相比,WCF不僅可以部署在IIS上還可以部署在應用程式中或者Windows服務中;

    4、只要支持標準的web service,可以跨行程、跨機器甚至于跨平臺的通信,

  三、WebApi的特點:

    1、需要通過URI資訊來指定端點,每一個URI代表1種資源;

    2、可通過不同的http動作表達不同的含義,客戶端使用GET、POST、PUT、DELETE4個表示操作方式的動詞對服務端資源進行操作:GET用來獲取資源,POST用來新建資源(也可以用于更新資源),PUT用來更新資源,DELETE用來洗掉資源;

    3、通過請求來實作對資源的資源,資源的表現形式大多是XML或者HTML(亦或其它),請求的回復通過Http Status Code表達不同含義,并且客戶端可以通過Accept header來與服務器協商格式,例如希望服務器回傳JSON格式還是XML格式亦或者其他擴展格式;

    4、支持跨平臺、CORS跨域呼叫WebApi,如通過前端js或者直接在后臺呼叫它,部署時支持Self-host或者IIS,;

    5、客戶端與服務端之間的互動在請求之間是無狀態的,從客戶端到服務端的每個請求都必須包含理解請求所必需的資訊,

  聊完它們的特點,那么如何物盡其用呢?(參考鏈接:https://blog.csdn.net/u013043518/java/article/details/51793294)

    1、當你想創建一個支持訊息、訊息佇列、雙工通信的服務時,你應該選擇WCF

    2、當你想創建一個服務,可以用更快速的傳輸通道時,像TCP、NamedPipes或者甚至是UDP(在WCF4.5中),在其他傳輸通道不可用的時候也可以支持HTTP,

    3、當你想創建一個基于HTTP的面向資源的服務并且可以使用HTTP的全部特征時(比如URIs、request/response頭,快取,版本控制,多種內容格式),你應該選擇WebAPI

    4、當你想讓你的服務用于瀏覽器、手機、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=https://www.cnblogs.com/laziji666/p/Newtonsoft.Json.JsonConvert.DeserializeObject(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 = https://www.cnblogs.com/laziji666/p/{ 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 = https://www.cnblogs.com/laziji666/p/{ 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

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/20493.html

標籤:C#

上一篇:C#基礎篇——事件

下一篇:【半譯】擴展shutdown超時設定以保證IHostedService正常關閉

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • C#多執行緒學習(二) 如何操縱一個執行緒

    <a href="https://www.cnblogs.com/x-zhi/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2943582/20220801082530.png" alt="" /></...

    uj5u.com 2023-04-19 09:17:20 more
  • C#多執行緒學習(二) 如何操縱一個執行緒

    C#多執行緒學習(二) 如何操縱一個執行緒 執行緒學習第一篇:C#多執行緒學習(一) 多執行緒的相關概念 下面我們就動手來創建一個執行緒,使用Thread類創建執行緒時,只需提供執行緒入口即可。(執行緒入口使程式知道該讓這個執行緒干什么事) 在C#中,執行緒入口是通過ThreadStart代理(delegate)來提供的 ......

    uj5u.com 2023-04-19 09:16:49 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    <a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...

    uj5u.com 2023-04-18 08:39:04 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    一:背景 1. 講故事 前段時間協助訓練營里的一位朋友分析了一個程式卡死的問題,回過頭來看這個案例比較經典,這篇稍微整理一下供后來者少踩坑吧。 二:WinDbg 分析 1. 為什么會卡死 因為是表單程式,理所當然就是看主執行緒此時正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ......

    uj5u.com 2023-04-18 08:33:10 more
  • SignalR, No Connection with that ID,IIS

    <a href="https://www.cnblogs.com/smartstar/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u36196.jpg" alt="" /></a>...

    uj5u.com 2023-03-30 17:21:52 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:15:33 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:13:31 more
  • C#遍歷指定檔案夾中所有檔案的3種方法

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-03-27 14:46:55 more
  • C#/VB.NET:如何將PDF轉為PDF/A

    <a href="https://www.cnblogs.com/Carina-baby/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2859233/20220427162558.png" alt="" />...

    uj5u.com 2023-03-27 14:46:35 more
  • 武裝你的WEBAPI-OData聚合查詢

    <a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...

    uj5u.com 2023-03-27 14:46:16 more