成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專(zhuān)欄INFORMATION COLUMN

JS基礎(chǔ)篇--JS之表單提交時(shí)編碼類(lèi)型enctype詳解

ad6623 / 3250人閱讀

摘要:格式支持比鍵值對(duì)復(fù)雜得多的結(jié)構(gòu)化數(shù)據(jù),這一點(diǎn)也很有用。例如下面這段代碼最終發(fā)送的請(qǐng)求是這種方案,可以方便的提交復(fù)雜的結(jié)構(gòu)化數(shù)據(jù),特別適合的接口。

簡(jiǎn)介

form的enctype屬性為編碼方式,常用有兩種:application/x-www-form-urlencodedmultipart/form-data,默認(rèn)為application/x-www-form-urlencoded。

當(dāng)action為get時(shí)候,瀏覽器用x-www-form-urlencoded的編碼方式把form數(shù)據(jù)轉(zhuǎn)換成一個(gè)字串(name1=value1&name2=value2...),然后把這個(gè)字串a(chǎn)ppend到url后面,用?分割,加載這個(gè)新的url。

當(dāng)action為post時(shí)候,瀏覽器把form數(shù)據(jù)封裝到http body中,然后發(fā)送到server。如果沒(méi)有type=file的控件,用默認(rèn)的application/x-www-form-urlencoded就可以了。 但是如果有type=file的話,就要用到multipart/form-data了。瀏覽器會(huì)把整個(gè)表單以控件為單位分割,并為每個(gè)部分加上Content-Disposition(form-data或者file),Content-Type(默認(rèn)為text/plain),name(控件name)等信息,并加上分割符(boundary)。

根據(jù)查找的資料得到如下總結(jié):

application/x-www-form-urlencoded: 窗體數(shù)據(jù)被編碼為名稱(chēng)/值對(duì)。這是標(biāo)準(zhǔn)的編碼格式。

multipart/form-data: 窗體數(shù)據(jù)被編碼為一條消息,頁(yè)上的每個(gè)控件對(duì)應(yīng)消息中的一個(gè)部分。

text/plain: 窗體數(shù)據(jù)以純文本形式進(jìn)行編碼,其中不含任何控件或格式字符。

HTTP/1.1 協(xié)議規(guī)定的 HTTP 請(qǐng)求方法有 OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、CONNECT 這幾種。其中 POST 一般用來(lái)向服務(wù)端提交數(shù)據(jù),本文主要討論 POST 提交數(shù)據(jù)的幾種方式。

我們知道,HTTP 協(xié)議是以 ASCII 碼傳輸,建立在 TCP/IP 協(xié)議之上的應(yīng)用層規(guī)范。規(guī)范把 HTTP 請(qǐng)求分為三個(gè)部分:狀態(tài)行、請(qǐng)求頭、消息主體。類(lèi)似于下面這樣:

  


協(xié)議規(guī)定 POST 提交的數(shù)據(jù)必須放在消息主體(entity-body)中,但協(xié)議并沒(méi)有規(guī)定數(shù)據(jù)必須使用什么編碼方式。實(shí)際上,開(kāi)發(fā)者完全可以自己決定消息主體的格式,只要最后發(fā)送的 HTTP 請(qǐng)求滿足上面的格式就可以。

但是,數(shù)據(jù)發(fā)送出去,還要服務(wù)端解析成功才有意義。一般服務(wù)端語(yǔ)言如 php、python 等,以及它們的 framework,都內(nèi)置了自動(dòng)解析常見(jiàn)數(shù)據(jù)格式的功能。服務(wù)端通常是根據(jù)請(qǐng)求頭(headers)中的 Content-Type 字段來(lái)獲知請(qǐng)求中的消息主體是用何種方式編碼,再對(duì)主體進(jìn)行解析。所以說(shuō)到 POST 提交數(shù)據(jù)方案,包含了 Content-Type 和消息主體編碼方式兩部分。

是什么決定了表單的編碼?

熟悉表單元素

的小伙伴,對(duì)其中的屬性enctype一定不會(huì)陌生,就是它規(guī)定了對(duì)表單提交給服務(wù)器時(shí)表單數(shù)據(jù)編碼的內(nèi)容類(lèi)型(Content Type)。

表單編碼類(lèi)型

知道了表單編碼由enctype決定的,那么它究竟有多少可選的取值呢?是不是所有的MIME類(lèi)型它都能用呢?
實(shí)際上,根據(jù)HTML5 規(guī)范中所敘述的,enctype具有以下三種選項(xiàng),其中最后一項(xiàng)text/plain是相比4.01新增的。

application/x-www-form-urlencoded

multipart/form-data

text/plain

application/x-www-form-urlencoded

這是默認(rèn)的編碼類(lèi)型,使用該類(lèi)型時(shí),會(huì)將表單數(shù)據(jù)中非字母數(shù)字的字符轉(zhuǎn)換成轉(zhuǎn)義字符,如"%HH",然后組合成這種形式key1=value1&key2=value2;所以后端在取數(shù)據(jù)后,要進(jìn)行解碼。請(qǐng)求類(lèi)似于下面這樣(無(wú)關(guān)的請(qǐng)求頭在本文中都省略掉了):

POST http://www.example.com HTTP/1.1
Content-Type: application/x-www-form-urlencoded;charset=utf-8

title=test&sub%5B%5D=1&sub%5B%5D=2&sub%5B%5D=3

首先,Content-Type 被指定為 application/x-www-form-urlencoded;其次,提交的數(shù)據(jù)按照 key1=val1&key2=val2 的方式進(jìn)行編碼,key 和 val 都進(jìn)行了 URL 轉(zhuǎn)碼。大部分服務(wù)端語(yǔ)言都對(duì)這種方式有很好的支持。例如 PHP 中,$_POST["title"] 可以獲取到 title 的值,$_POST["sub"] 可以得到 sub 數(shù)組。

很多時(shí)候,我們用 Ajax 提交數(shù)據(jù)時(shí),也是使用這種方式。例如 JQuery 和 QWrap 的 Ajax,Content-Type 默認(rèn)值都是「application/x-www-form-urlencoded;charset=utf-8」

注意:若表單中有文件,則只留文件名。

multipart/form-data

這又是一個(gè)常見(jiàn)的 POST 數(shù)據(jù)提交的方式。我們使用表單上傳文件時(shí),必須讓 表單的 enctype 等于 multipart/form-data。直接來(lái)看一個(gè)請(qǐng)求示例:

Request Headers:

Accept:application/json, text/plain, */*
Accept-Encoding:gzip, deflate
Accept-Language:zh-CN,zh;q=0.8
Connection:keep-alive
Content-Length:13125
Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryaqWXpQYCfMbAHgPh
Cookie:shiro.sesssion=1a6d4f4d-ab5f-4a1b-a5cd-fc71cf9633cb
Host:192.168.199.223
Origin:http://192.168.199.223
Referer:http://192.168.199.223/
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36

Request Payload:

------WebKitFormBoundaryaqWXpQYCfMbAHgPh
Content-Disposition: form-data; name="fileEnterprise"; filename="a.jpg"
Content-Type: image/jpeg


------WebKitFormBoundaryaqWXpQYCfMbAHgPh
Content-Disposition: form-data; name="enterpriseName"

有限責(zé)任公司
------WebKitFormBoundaryaqWXpQYCfMbAHgPh
Content-Disposition: form-data; name="unifiedSocialCreditCode"

91530700781667237G
------WebKitFormBoundaryaqWXpQYCfMbAHgPh--

注意:

一般來(lái)說(shuō),methodenctype是兩個(gè)不同的互不影響的屬性,但在傳文件時(shí),method必須要指定為POST,否則文件只剩下filename了;

當(dāng)沒(méi)有傳文件時(shí),enctype會(huì)改回默認(rèn)的application/x-www-form-urlencoded。

這個(gè)例子稍微復(fù)雜點(diǎn)。首先生成了一個(gè) boundary 用于分割不同的字段,為了避免與正文內(nèi)容重復(fù),boundary 很長(zhǎng)很復(fù)雜。然后 Content-Type 里指明了數(shù)據(jù)是以 multipart/form-data 來(lái)編碼,本次請(qǐng)求的 boundary 是什么內(nèi)容。消息主體里按照字段個(gè)數(shù)又分為多個(gè)結(jié)構(gòu)類(lèi)似的部分,每部分都是以 --boundary 開(kāi)始,緊接著是內(nèi)容描述信息,然后是回車(chē),最后是字段具體內(nèi)容(文本或二進(jìn)制)。如果傳輸?shù)氖俏募?,還要包含文件名和文件類(lèi)型信息。消息主體最后以 --boundary-- 標(biāo)示結(jié)束。關(guān)于 multipart/form-data 的詳細(xì)定義,請(qǐng)前往 rfc1867 查看。

這種方式一般用來(lái)上傳文件,各大服務(wù)端語(yǔ)言對(duì)它也有著良好的支持。

上面提到的這兩種 POST 數(shù)據(jù)的方式,都是瀏覽器原生支持的,而且現(xiàn)階段標(biāo)準(zhǔn)中原生 表單也只支持這兩種方式(通過(guò) 元素的 enctype 屬性指定,默認(rèn)為 application/x-www-form-urlencoded。其實(shí) enctype 還支持 text/plain,不過(guò)用得非常少)。

隨著越來(lái)越多的 Web 站點(diǎn),尤其是 WebApp,全部使用 Ajax 進(jìn)行數(shù)據(jù)交互之后,我們完全可以定義新的數(shù)據(jù)提交方式,給開(kāi)發(fā)帶來(lái)更多便利。

text/plain

按照鍵值對(duì)排列表單數(shù)據(jù)key1=value1 key2=value2,不進(jìn)行轉(zhuǎn)義。

注意:若表單中有文件,則只留文件名。

application/json及其他MIME類(lèi)型

application/json 這個(gè) Content-Type 作為響應(yīng)頭大家肯定不陌生。實(shí)際上,現(xiàn)在越來(lái)越多的人把它作為請(qǐng)求頭,用來(lái)告訴服務(wù)端消息主體是序列化后的 JSON 字符串。由于 JSON 規(guī)范的流行,除了低版本 IE 之外的各大瀏覽器都原生支持 JSON.stringify,服務(wù)端語(yǔ)言也都有處理 JSON 的函數(shù),使用 JSON 不會(huì)遇上什么麻煩。

JSON 格式支持比鍵值對(duì)復(fù)雜得多的結(jié)構(gòu)化數(shù)據(jù),這一點(diǎn)也很有用。記得我?guī)啄昵白鲆粋€(gè)項(xiàng)目時(shí),需要提交的數(shù)據(jù)層次非常深,我就是把數(shù)據(jù) JSON 序列化之后來(lái)提交的。不過(guò)當(dāng)時(shí)我是把 JSON 字符串作為 val,仍然放在鍵值對(duì)里,以 x-www-form-urlencoded 方式提交。

Google 的 AngularJS 中的 Ajax 功能,默認(rèn)就是提交 JSON 字符串。例如下面這段代碼:

var data = {"title":"test", "sub" : [1,2,3]};
$http.post(url, data).success(function(result) {
    ...
});

最終發(fā)送的請(qǐng)求是:

POST http://www.example.com HTTP/1.1 
Content-Type: application/json;charset=utf-8

{"title":"test","sub":[1,2,3]}

這種方案,可以方便的提交復(fù)雜的結(jié)構(gòu)化數(shù)據(jù),特別適合 RESTful 的接口。各大抓包工具如 Chrome 自帶的開(kāi)發(fā)者工具、Firebug、Fiddler,都會(huì)以樹(shù)形結(jié)構(gòu)展示 JSON 數(shù)據(jù),非常友好。但也有些服務(wù)端語(yǔ)言還沒(méi)有支持這種方式,例如 php 就無(wú)法通過(guò) $_POST 對(duì)象從上面的請(qǐng)求中獲得內(nèi)容。這時(shí)候,需要自己動(dòng)手處理下:在請(qǐng)求頭中 Content-Type 為 application/json 時(shí),從 php://input 里獲得原始輸入流,再 json_decode 成對(duì)象。一些 php 框架已經(jīng)開(kāi)始這么做了。

當(dāng)然 AngularJS 也可以配置為使用 x-www-form-urlencoded 方式提交數(shù)據(jù)。

另外,還需要說(shuō)明表單數(shù)據(jù)編碼類(lèi)型application/json,已經(jīng)被W3C遺棄(詳見(jiàn)HTML JSON Form Submission),建議不要在中使用了,即使用了如果瀏覽器不支持,也會(huì)替換成application/x-www-form-urlencoded

同理,其余的MIME類(lèi)型,也不支持,均會(huì)替換成默認(rèn)編碼application/x-www-form-urlencoded。

注:1.MIME (Multipurpose Internet Mail Extensions) 是描述消息內(nèi)容類(lèi)型的因特網(wǎng)標(biāo)準(zhǔn)。
2.MIME 消息能包含文本、圖像、音頻、視頻以及其他應(yīng)用程序?qū)S玫臄?shù)據(jù)。

想要了解詳細(xì)的Mime 類(lèi)型列表,請(qǐng)參考《W3school:MIME 參考手冊(cè)》

總結(jié)

所以,enctype可以認(rèn)為就是表單數(shù)據(jù)的content type(MIME type),只不過(guò)其取值不能用除了上面提到的三個(gè),否則會(huì)轉(zhuǎn)換成默認(rèn)的編碼。
參考地址:《四種常見(jiàn)的 POST 提交數(shù)據(jù)方式》

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/89501.html

相關(guān)文章

  • 表單提交時(shí)編碼類(lèi)型enctype詳解

    摘要:以下引用,摘自規(guī)范的章節(jié)這不就是我們?cè)诨卣{(diào)函數(shù)里判斷返回?cái)?shù)據(jù)的類(lèi)型,并且是在請(qǐng)求頭中的那個(gè)玩意兒?jiǎn)釠](méi)錯(cuò)就是它根據(jù)規(guī)范的基礎(chǔ)數(shù)據(jù)類(lèi)型的說(shuō)明,這個(gè)指定了連接資源的屬性,同時(shí)也是的那些媒體類(lèi)型。今天掰扯完了表單提交時(shí)的編碼類(lèi)型,以及它和的關(guān)系。 很早以前,當(dāng)還沒(méi)有前端這個(gè)概念的時(shí)候,我在寫(xiě)表單提交完全不去理會(huì)表單數(shù)據(jù)的編碼,在action屬性里寫(xiě)好目標(biāo)URL,剩下的啊交給瀏覽器吧~但是現(xiàn)在,...

    jackzou 評(píng)論0 收藏0
  • HTMl基礎(chǔ)

    摘要:每個(gè)表格均有若干行由標(biāo)簽定義,每行被分割為若干單元格由標(biāo)簽定義。字母指表格數(shù)據(jù),即數(shù)據(jù)單元格的內(nèi)容。數(shù)據(jù)單元格可以包含文本圖片列表段落表單水平線表格等等。表格最重要的目的是顯示表格類(lèi)數(shù)據(jù)。規(guī)定在提交表單時(shí)所用的方法默認(rèn)。 import socket def main(): sock = socket.socket(socket.AF_INET, socket.SOCK_STRE...

    番茄西紅柿 評(píng)論0 收藏0
  • form表單那點(diǎn)事兒(上) 基礎(chǔ)

    摘要:用于或元素時(shí),將提交指定的表單示例代碼只能上傳圖片只能上傳視頻使用的屬性,是一個(gè)類(lèi)型的值,或文件后綴名。在以前,要想改變表單元素外觀,需要通過(guò)其他標(biāo)簽來(lái)模擬。以下點(diǎn)到名的表單元素,還是可以照常使用的。 做為html中最為常見(jiàn),應(yīng)用最廣泛的標(biāo)簽之一,form常伴隨前端左右。了解更深,用的更順。 表單屬性 這個(gè)表單展示了form表單常用的屬性 屬性名 屬性值 ...

    Forest10 評(píng)論0 收藏0
  • 關(guān)于前端上傳文件全面基礎(chǔ)掃盲貼(零)

    摘要:表單用于向服務(wù)器傳輸數(shù)據(jù)。屬性對(duì)象的屬性指定了一個(gè)事件句柄函數(shù)。標(biāo)簽的屬性應(yīng)當(dāng)與相關(guān)元素的屬性相同。詳情查閱請(qǐng)狠狠地點(diǎn)擊關(guān)于對(duì)象代表表單中的一個(gè)提交按鈕在表單提交之前,觸發(fā)事件句柄,并且一個(gè)句柄可以通過(guò)返回來(lái)取消表單提交。 系列文章 關(guān)于前端上傳文件全面基礎(chǔ)掃盲貼(零)關(guān)于前端上傳文件全面基礎(chǔ)掃盲貼(一) ----- XMLHttpRequest關(guān)于前端上傳文件全面基礎(chǔ)掃盲貼(二) -...

    SnaiLiu 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<