ASP.NET (Core)WebApi參數(shù)傳遞實(shí)操演練
一、ASP.NET (Core)WebApi參數(shù)傳遞實(shí)操演練
1、什么是contentType和dataType?
$.ajax contentType 和 dataType , contentType 主要設(shè)置你發(fā)送給服務(wù)器的格式,dataType設(shè)置你收到服務(wù)器數(shù)據(jù)的格式。
更簡(jiǎn)單的解釋:
contentType: 告訴服務(wù)器,我要發(fā)什么類型的數(shù)據(jù)。
dataType:告訴服務(wù)器,我要想什么類型的數(shù)據(jù)。在http 請(qǐng)求中,get 和 post 是最常用的。在 jquery 的 ajax 中, contentType都是默認(rèn)的值:application/x-www-form-urlencoded,這種格式的特點(diǎn)就是,name/value 成為一組,每組之間用 & 聯(lián)接,而 name與value 則是使用 = 連接。如:wwwh.baidu.com/q?key=fdsa&lang=zh 這是get , 而 post 請(qǐng)求則是使用請(qǐng)求體,參數(shù)不在 url 中,在請(qǐng)求體中的參數(shù)表現(xiàn)形式也是: key=fdsa&lang=zh的形式。
鍵值對(duì)這樣組織在一般的情況下是沒(méi)有什么問(wèn)題的,這里說(shuō)的一般是,不帶嵌套類型JSON,也就是 簡(jiǎn)單的JSON,形如這樣:
{a:1,b:2,c:3}
但是在一些復(fù)雜的情況下就有問(wèn)題了。例如在 ajax 中你要傳一個(gè)復(fù)雜的 json 對(duì)像,也就說(shuō)是對(duì)象嵌數(shù)組,數(shù)組中包括對(duì)象,如果你這樣傳:
{data: {a: [{x:2}] }}
這個(gè)復(fù)雜對(duì)象, application/x-www-form-urlencoded 這種形式是沒(méi)有辦法將復(fù)雜的 JSON 組織成鍵值對(duì)形式(當(dāng)然也有方案這點(diǎn)可以參考) ,你傳進(jìn)去可以發(fā)送請(qǐng)求,但是服務(wù)端收到數(shù)據(jù)為空, 因?yàn)?ajax 沒(méi)有辦法知道怎樣處理這個(gè)數(shù)據(jù)。
這怎么可以呢?
聰明的程序員發(fā)現(xiàn) http 還可以自定義數(shù)據(jù)類型,于是就定義一種叫 application/json 的類型。這種類型是 text , 我們 ajax 的復(fù)雜JSON數(shù)據(jù),用 JSON.stringify序列化后,然后發(fā)送,在服務(wù)器端接到然后用 JSON.parse 進(jìn)行還原就行了,這樣就能處理復(fù)雜的對(duì)象了。
$.ajax({
dataType: 'json',
contentType:
'application/json',
data: JSON.stringify({a: [{b:1, a:1}]}
)})
2、什么是參數(shù)綁定(Parameter Binding)?
Asp.NET Web API中Controller是如何解析從客戶端傳遞過(guò)來(lái)的數(shù)據(jù),然后賦值給Controller的參數(shù)的,也就是參數(shù)綁定或者模型綁定。
常見的綁定方式有如下四種。
路由值(Route Values):通過(guò)導(dǎo)航到路由如{controller}/{action}/{id}此時(shí)將綁定到id參數(shù)。
查詢字符串(QueryStrings):通過(guò)查詢字符串中的參數(shù)來(lái)綁定,如name=Jeffcky&id=1,此時(shí)name和id將進(jìn)行綁定。
請(qǐng)求Body(Body):通過(guò)在POST請(qǐng)求中將數(shù)據(jù)傳入到Body中此時(shí)將綁定如上述Person對(duì)象中。
請(qǐng)求Header(Header):綁定數(shù)據(jù)到Http中的請(qǐng)求頭中,這種相對(duì)來(lái)說(shuō)比較少見。
所以通過(guò)上述講述我們知道有多種方式將數(shù)據(jù)從客戶端傳遞到服務(wù)端,然后模型綁定會(huì)自動(dòng)為我們創(chuàng)建正確的方法來(lái)綁定到后臺(tái)參數(shù)中,簡(jiǎn)單和復(fù)雜的類型參數(shù)都會(huì)進(jìn)行綁定。
3、ASP.NET WebAPI中FromUri和FromBody兩類特性區(qū)別
1)、【FromUri】特性
應(yīng)用【FromUri】特性,Web API Action中參數(shù)將從URL中解析數(shù)據(jù)。
查詢字符串(QueryStrings):通過(guò)查詢字符串中的參數(shù)來(lái)綁定,如name=Jeffcky&id=1,此時(shí)name和id將進(jìn)行綁定,對(duì)應(yīng)WebAPI中媒體
類型格式化器JsonMediaTypeFormatter,對(duì)應(yīng)的content-type是:application/json !
2)、【FromBody】特性
應(yīng)用【Frombody】特性,Web API Action中參數(shù)將從請(qǐng)求體(Request Body),并且通過(guò)媒體類型格式化器獲取和綁定數(shù)據(jù)。
請(qǐng)求Body(Body):通過(guò)在POST請(qǐng)求中將數(shù)據(jù)傳入到Body中此時(shí)將綁定如上述Person對(duì)象中,對(duì)應(yīng)WebAPI中媒體類型格式化器
FormUrlEncodedMediaTypeFormatter,對(duì)應(yīng)的content-type是:application/x-www-form-urlencoded !
注意:對(duì)多個(gè)參數(shù)使用FromBody不起作用?。?!
二、實(shí)戰(zhàn)運(yùn)用(PS:一般這幾種場(chǎng)景就能夠滿足我們實(shí)際開發(fā)工作需要了)
1、ASP.NET WebApi參數(shù)傳遞實(shí)操演練







2、ASP.NET Core WebApi參數(shù)傳遞實(shí)操演練







三、總結(jié)
其實(shí)說(shuō)了這么多,簡(jiǎn)單類型綁定和復(fù)雜類型綁定在本質(zhì)上沒(méi)什么太大的區(qū)別,真正的區(qū)別在于數(shù)據(jù)綁定是通過(guò)GET請(qǐng)求還是POST請(qǐng)求 。
說(shuō)白了就是【FromUri】特性和【FromBody】特性之間的區(qū)別。【FromUri】和【FromQuery】 :一般用與單個(gè)簡(jiǎn)單類型的參數(shù)。
【FromBody】 :一般用于將多個(gè)簡(jiǎn)單類型的參數(shù)打包成一個(gè)復(fù)雜對(duì)象類型的參數(shù) 。
注意:對(duì)多個(gè)參數(shù)使用FromBody不起作用,即也就是說(shuō),[FromBody] 修飾的參數(shù)只能有一個(gè)。
四、源代碼示例下載
非常感謝對(duì)【跟著阿笨一起玩NET】的支持,有問(wèn)題微信公眾號(hào)回復(fù)wx關(guān)鍵字,加阿笨的個(gè)人微信號(hào)。
《ASP.NET (Core)WebApi參數(shù)傳遞實(shí)操演練》源碼下載(注意下載地址區(qū)分大小寫哦)
關(guān)注公眾號(hào),回復(fù)關(guān)鍵字提取碼:vrib

騰訊課堂
網(wǎng)易云課堂
