詳解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] 進行修飾(暫且不評論,我覺的用Get方式就好了)
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
總結
歡迎討論,歡迎討論,歡迎指出不正確之處,歡迎一起學習!也鼓勵大家認真寫博客,鞏固自己和他人。
詳解ASP.NET Core API 的Get和Post請求使用方式