1. 程式人生 > 實用技巧 >.net core api-ajax 請求 的 資料型別

.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、ControllerControllerBase多了 View 相關支援:View、PartialView、JsonResult、ViewComponent

   3、ControllerControllerBase多了TempData、ViewData、ViewBag

   所以,如果只是單純使用 Web API 不會使用到 View 相關功能,應該在建立 Controller 時就繼承自ControllerBase而非ControllerActionResult是控制器方法執行後返回的結果型別,控制器方法可以返回一個直接或間接從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

簡單分析到這裡吧

    

 

FromBody