.net core api-ajax 請求 的 資料型別
專案中一個簡單的資料互動,是由前端帶上引數向後端請求資料,後端接受資料,並且返回給前端。但是,某些時候在寫的過程中會發現,後端並不能接收到前端給的資料,或者返回的資料亂碼,甚至在地址正確的情況下請求不到後端的函式或者介面。再者,後段請求完成,前端拿不到資料的情況。遇到這種問題真的很糟心。之所以會產生這種情況主要是由請求的資料型別有關。接下來就這個問題我來發表一下我學習到的內容。
Ajax:
前端引數:
data:要求為Object或String型別的引數,傳送到伺服器的資料。如果已經不是字串,將自動轉換為字串格式。get請求中將附加在url後。防止這種自動轉換,可以檢視 processData選項。物件必須為 key/value格式,例如{foo1:"bar1",foo2:"bar2"}轉換為&foo1=bar1&foo2=bar2。如果是陣列,JQuery將自動為不同值對應同一個名稱。例如{foo:["bar1","bar2"]}轉換為&foo=bar1&foo=bar2。
contentType:要求為String型別的引數,當傳送資訊至伺服器時,內容編碼型別預設為"application/x-www-form-urlencoded"。該預設值適合大多數應用場合。不過,國內大多是application/json; charset=utf-8, 來適應引數中有漢字的問題
後端引數:
dataType:要求為String型別的引數,預期伺服器返回的資料型別。如果不指定,JQuery將自動根據http包mime資訊返回responseXML或responseText,並作為回撥函式引數傳遞。
請求如下:
$.ajax({ url:"",//預設為當前頁地址 type: "GET",//請求方式(post或get)預設為get data: {},//傳送到伺服器的資料 dataType: "test",//預期返回型別,如果不指定,JQuery將自動根據http包mime資訊返回responseXML或responseText,並作為回撥函式引數傳遞。 contentType:"application/json; charset=utf-8",//傳送到伺服器的資料的編碼型別 success: function(res) { console.log(res) }, error: function(XMLHttpRequest, textStatus, errorThrown) { console.log("error"); console.log(XMLHttpRequest); console.log(textStatus); console.log(errorThrown); } })
關於ajax的型別節選自:https://www.cnblogs.com/tylerdonet/p/3520862.html
Server:
我們在建立一個介面的話,需要建立一個控制器
這邊有MVC控制器和一個API控制器供大家選擇,這兩個有什麼不同呢?
新建出兩個控制器,從直觀上看,MVCController就是個普通的Controller,APIController 也類似於一個普通的Controller ,然後細心點會發現APIController 頭部多了一個[ApiController][Route("[controller]")],這兩個。不過MVCController如果在頭部註明[ApiController][Route("[controller]")] 也可以當做API去請求。多說一點[Route("[controller]")]通常按照[Route("[controller]/[action]")]的寫法,表明控制器名字和函式名,前面也可以加其他驗證。
那麼這兩個不就一眼了嗎,還有什麼區別呢?嗯...接著觀察會發現,繼承的類也不一樣,MVCController繼承Controller,APIController 繼承ControllerBase。所以說這個兩個繼承的類不同,其他的就是一種檔案。
Controller和ControllerBase這兩個類又有什麼不同呢?
首先F12點進去,很明顯的看到
1、Controller繼承與ControllerBase
2、Controller
比ControllerBase
多了 View 相關支援:View、PartialView、JsonResult、ViewComponent
3、Controller
比ControllerBase
多了TempData、ViewData、ViewBag
所以,如果只是單純使用 Web API 不會使用到 View 相關功能,應該在建立 Controller 時就繼承自ControllerBase
而非Controller
ActionResult是控制器方法執行後返回的結果型別,控制器方法可以返回一個直接或間接從ActionResult抽象類繼承的型別,如果返回的 是非ActionResult型別,控制器將會將結果轉換為一個ContentResult型別。預設的ControllerActionInvoker 呼叫ActionResult.ExecuteResult方法生成應答結果。
關於Controller
的區別節選自:https://blog.yowko.com/aspdotnet-core-controller-controllerbase/
互動
返回字元型別
當然如果知道字元型別具體的型別可以直接使用string 前端dataType 為text 就可以了,但是如果返回是個Model的話前端不知道這個型別這時候需要瞭解一下ActionResult這個類了。
JsonResult:
我們返回一個json格式的資料在ControllerBase裡直接使用JsonResult 型別就可以了,前端dataType為json 效果如下:
web:
server:
web result:
F12進入JonsResult 類可見,它既可以返回一個物件,也可以返回一個字元,非常的NICE
IActionResult
在ControllerBase是沒有JonsResult 的,如果返回一個json 怎麼辦呢,這時候就用到IActionResult這個類了
官方文件是這樣子的
嗯他返回了一個Ok親測有效
最後一個問題就是後端接受返回的資料
字元型別接收
前端json格式的data
後端一個string或者int根據具體的資料型別就可以接收到,其中資料會自動轉換的,但是string型別寫個漢字用int接受肯定不行的。
Model接收
如果後端直接一個model扔過去,肯定是404.因為前端不知道你這個模型的存在。
官方使用的是FromBody屬性
然後我發現,沒用跟以前一樣404,我就該用了FromForm找是找到了這個函式,而且所有的[FromQuery]都接收到了資料,需要在每個需要的欄位加上[FromQuery]
這個apiController這個貌似是2.1開始才有的不加ApiController的話,預設是FromForm,加了預設是FromBody
OVER
簡單分析到這裡吧