詳解ASP.NET Core API 的Get和Post請求使用方式
上一篇文章幫助大家解決問題不徹底導致博友使用的時候還是遇到一些問題,歡迎一起討論。下面重點詳細講解我們常用的Get和Post請求 ( 以.net core2.2的Http[Verb]為方向 ,推薦該屬性路由),如果想驗證,直接利用VS2017建立ASP.NET Core API (.net core 2.2),在DefaultController裡面操作。文中有些關鍵字,我是加了粗的,請注意一下
幫助回憶,Get和Post區別?
-
get引數通過url傳遞,post放在request body中。
-
get請求在url中傳遞的引數是有長度限制的,而post沒有。
-
get比post更不安全,因為引數直接暴露在url中,所以不能用來傳遞敏感資訊。
-
get請求只能進行url編碼,而post支援多種編碼方式
-
get請求會瀏覽器主動cache,而post支援多種編碼方式。
-
get請求引數會被完整保留在瀏覽歷史記錄裡,而post中的引數不會被保留。
-
get和post質上就是tcp連結,並無差別。但是由於HTTP的規定和瀏覽器/伺服器的限制,導致他們在應用過程中體現出一些不同。
-
get產生一個tcp資料包;post產生兩個tcp資料包。對於get方式的請求,瀏覽器會把http header和data一併傳送出去,伺服器響應200(返回資料);而對於post,瀏覽器先發送header,伺服器響應100 continue,瀏覽器再發送data,伺服器響應200 ok(返回資料)。
在做資料查詢時,建議用get方式;而在做資料新增、修改或刪除時,建議用post方式;
Get請求
無參請求
1)預設方式
什麼是預設方式呢?就是你整個Controller裡面只有唯一一個HttpGet請求方式,請求路徑:api/[controller] 。程式碼如下圖:

如果有兩個呢?如下圖以及前端頁面返回異常結果:

返回結果提示有多個匹配項並報出異常,這個是為啥?明明兩個方法名都不一樣。 其實是:當我們利用VS2017 .net core生成API專案時,ASP.NET Core API專案預設使用 屬性路由 , 不是傳統路由。傳統路由會根據Url地址去匹配方法Action。
微軟:生成 REST API 時,支援使用 Http[Verb] 屬性的屬性路由 (就是本文所闡述的內容),並且很少會在操作方法上使用 [Route(...)]。 建議使用更特定的 Http[Verb] Attributes 來明確 API 所支援的操作。 REST API 的客戶端需要知道對映到特定邏輯操作的路徑和 Http 謂詞。( 個人覺的 Http[Verb] 屬性路由比 Route屬性路由簡潔 )
2)路由模板設定
但現實是,我的Controller裡面不可能只有一個httpGet方法,怎麼辦?引出路由模板的概念
如下圖,可以看到httpGet屬性提供了一個路由模板設計,兩個可選的. template意思是新的路由模板,Name可以new 一個新的HttpGetAttribute,Order是可以設定請求處理順序

對應進行設定,及相應結果如下:

有參請求
1)預設方式
如果是單單利用id去獲取一條資料,利用如下圖所示就可以達到,此種方式請求路徑操作簡單api/values/id就行,大括號裡面的{}名稱必須和引數名保持一致

如上所示不能滿足get的多個引數請求方式,如果有多個引數又要使用get請求,就要回到老套路,如下圖所示

2)路由模板設定
同樣,新路由模板攜帶方便請求的簡約引數nameid就行,大括號裡面的{}名稱必須和引數名保持一致

如上圖不能滿足新路由模板get的多個引數請求方式,如果有多個引數又要使用get請求,就要回到老套路,如下圖所示

Post請求
無參請求
1)預設方式
如下圖所示,由於請求路徑是/api/values,所以整個controller會尋找Post請求
請求路徑:/api/[controller]

但是如果此時有另外一個Post方法,又沒有重新命名新的模板,無論是有沒有引數,都會報錯的。因為api/values請求路徑只會去找POST請求方式。所以要進行下面的路由模板設定

2)路由模板設定
跟httpGet請求方式的路由模板設定一樣,同樣有template,Name,Order三個引數可設定,後面兩個可選。
請求路徑:/api/values/PostMethod

有參請求
1) 預設方式
嘗試了很多方式,最終發現如下可行,請求路徑:/api/[controller]

Ajax和PostMan請求都需要contentType: "application/x-www-form-urlencoded" ,重點是不能使用 [ApiController] 和[FromBody] 進行修飾(暫且不評論)
Ajax請求程式碼如下:
$.ajax({ type: "POST", accepts: "application/x-www-form-urlencoded", url: "/api/post", contentType: "application/x-www-form-urlencoded", data: { 'value': '張三丰' }, error: function (jqXHR, textStatus, errorThrown) { alert("Something went wrong!"); }, success: function (result) { } });
2)路由模板設定
跟httpGet請求方式的路由模板設定一樣,同樣有template,Name,Order三個引數可設定,後面兩個可選。
請求路徑:/api/[controller]/PostName

3)組合引數請求
如果即有複雜型別引數,又有簡單型別引數同時存在,怎麼辦呢,如下所示:

此時請求控制器是要有顯示屬性 [ApiController] 即可。請求方式如下:
請求路徑:/api/todo?name=xiaoming&id=20

4)動態型別
如下圖所示,是支援dynamic的型別的引數的,contentType:“application/json”
請求路徑:/api/todo

總結
歡迎討論,歡迎討論,歡迎指出不正確之處,歡迎一起學習!