2018-05-09 HTTP參數(shù)的表單和JSON區(qū)別

背景

在前后端分離的開發(fā)組中,

前端通常對(duì)自己代碼組織的比較細(xì)致,都會(huì)對(duì)AJAX,或者小程序API做封裝。

而很多前端開發(fā)對(duì)后端接口要求的傳參 一頭霧水,后端開發(fā)人員對(duì)HTTP一知半解,傳參接收不到,說不清楚,互相推脫,誰誰應(yīng)該改傳參方式。

HTTP協(xié)議中:Content-Type,估計(jì)是非常非常多的人弄不清楚。

本質(zhì)上Content-Type 要么就是 text/html要么就是 json要么就是 表單。

本質(zhì)上 非常簡單,但總是有人搞不清楚,總是在這個(gè)上面浪費(fèi)時(shí)間。

吐槽:本人來公司一年了,總是在給同事講這個(gè)Content-Type。

JSON

當(dāng)Content-Typeapplication/json 的時(shí)候,HTTP POST請(qǐng)求數(shù)據(jù)必須是JSON的。
任何框架都必須遵守這個(gè)協(xié)議,如果不支持,則說明框架不完善,開發(fā)者可能知識(shí)比較片面。

例子:

HTTP POST

header:
Content-Type: "application/json"

body:
{
    "key1": value1,
    "key2": value2
}

其中整個(gè)JSON就是 參數(shù)本身,他沒有KEY,沒有名稱。key1 ,key2嚴(yán)格說只是屬性。

表單

當(dāng)Content-Typex-www-form-urlencoded 的時(shí)候,POST 的請(qǐng)求數(shù)據(jù)必須是表單的。
甚至很多開發(fā)者印象中,參數(shù)就是個(gè)名字為key 值為value這種印象,這是非常膚淺的認(rèn)識(shí)。

例子:

HTTP POST

header:
Content-Type: "x-www-form-urlencoded"

body:
key1=value1&key2=value2

何為表單參數(shù),就是以x-www-form-urlencoded為編碼的數(shù)據(jù)參數(shù),其中key1 和 key2就是參數(shù)。整個(gè)內(nèi)容就是為 以& 分隔的參數(shù)列表。

表單2

例子:這里用Chrome的F12中Network類似的表示HTTP POST請(qǐng)求

HTTP POST

header:
Content-Type: "x-www-form-urlencoded"

body:
key1=value1
key2={"key3":value3, "key4": value4}

那這個(gè)其實(shí)也是表單?。。。?!他的形式是表單里面嵌套了一個(gè)JSON字符串,作為其中的一個(gè)參數(shù)。

弄清楚這個(gè)了,其實(shí)根本不需要為了傳參而爭論半天。

什么情況應(yīng)該用什么傳參?

如果參數(shù)比較單一,只做GET查詢的時(shí)候,建議直接GET。URL上面就是表單參數(shù),和POST的表單一模一樣。

如果參數(shù)還是比較單一,但是參數(shù)值太多了,很長很長的字符串,用POST是毋庸置疑的。
這個(gè)時(shí)候,POST和表單其實(shí)是一樣的,都是在請(qǐng)求體里面。

如果參數(shù)是結(jié)構(gòu)化的,用POST JSON,毋容置疑。

如果參數(shù)是結(jié)構(gòu)化的,還需要AUTH,;例如帶個(gè)TOKEN,那么:

  • 使用上面的表單2,偽JSON表單,這種情況的壞處就是JAVA后端的 Model解析比較別扭,不太好建模。
  • 使用URL + 公共參數(shù)、Token,其余參數(shù)放在Body,以POST JSON傳參,沒有壞處,好處就是后端做攔截器,或者Filter的時(shí)候比較統(tǒng)一明了,不需要在Model里面涉及 公共參數(shù)。唯一的壞處就是,前端同學(xué)可能懶得弄。

小程序前端 與后端配合開發(fā)的經(jīng)驗(yàn)

前端封裝的框架,必須支持 公共參數(shù)追加到URL,并且可以以JSON傳參。
后端就可以依據(jù)以上的情況,靈活使用參數(shù)組織方式了,處理業(yè)務(wù)的代碼專心接受參數(shù),
攔截器直接通過URL獲取公共參數(shù)和Token,來做一些版本控制,身份認(rèn)證等功能。

如果前端不支持混和傳,要么都在JSON內(nèi),要么在URL上面,網(wǎng)上一堆文章說接收不到參數(shù),一邊倒說改成表單,改成GET等諸如此類。
那這開發(fā)素質(zhì)需要提升了。

問題是:微信小程序API request 是支持的application/json的?。?!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容