JS之表单提交时编码类型enctype详解

简介

form的enctype属性为编码方式,常因此出少数栽:application/x-www-form-urlencoded和multipart/form-data,默认为application/x-www-form-urlencoded。

当action为get时候,浏览器用x-www-form-urlencoded的编码方式把form数据易成为一个字串(name1=value1&name2=value2…),然后拿此字串append到url后面,用?分割,加载是新的url。

当action为post时候,浏览器把form数据封装到http
body中,然后发送到server。如果没type=file的控件,用默认的application/x-www-form-urlencoded就可了。
但是只要出type=file的语句,就要用multipart/form-data了。浏览器会拿全表单以控件为单位划分,并为每个片加上Content-Disposition(form-data或者file),Content-Type(默认为text/plain),name(控件name)等信息,并加上分割符(boundary)。

基于查找的素材取得如下总结:

  • application/x-www-form-urlencoded:
    窗体数据为编码为名称/值对
    。这是业内的编码格式。
  • multipart/form-data:
    窗体数据为编码为同一漫漫消息,页上之每个控件对许消息备受的一个局部
  • text/plain:
    窗体数据因纯文本形式进行编码,其中非带有任何控件或格式字符。

HTTP/1.1
协议确定的 HTTP 请求方法有
OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、CONNECT 这几种植。其中 POST
一般用来向服务端提交数据,本文主要讨论 POST 提交数据的几乎栽艺术。

咱清楚,HTTP 协议是以
ASCII 码传输,建立在 TCP/IP 协商之上的应用层规范。规范将 HTTP
请求分为三个组成部分:状态行、请求头、消息主体。类似于下这样:

<method> <request-URL> <version>
<headers>

<entity-body>

协和确定 POST
提交的数量必须在信息主体(entity-body)中,但情商并没确定数量必须使什么编码方式。实际上,开发者完全可以好主宰消息主体的格式,只要最后发送的
HTTP 请求满足上面的格式就可以。

可,数据发送出,还要服务端解析成才发含义。一般服务端语言如
php、python 等,以及它的
framework,都坐了机关分析常见数据格式的效应。服务端通常是冲请求头(headers)中之
Content-Type
字段来取得知要被之音主体是故何种方式编码,再针对重点进行剖析。所以说及
POST 提交数据方案,包含了 Content-Type 和信主体编码方式两局部。

凡是什么决定了表单的编码?

习表单元素<form>的小伙伴,对里面的性质enctype自然非会见生,就是其规定了针对性表单提交给服务器时表单数据编码的始末类型(Content
Type)。

表明单编码类型

晓了表单编码由enctype控制的,那么它们到底发生稍许而选取的取值呢?是匪是具有的MIME类型它都能用为?
实际上,根据HTML5
规范蒙所讲述的,enctype具有以下三种植选择,其中最后一件text/plain是相比4.01新增的。

  • application/x-www-form-urlencoded
  • multipart/form-data
  • text/plain

application/x-www-form-urlencoded

这是默认的编码类型,使用该品种时,会将表单数据被非字母数字的字符转换成为转义字符,如”%HH”,然后成成这种样式key1=value1&key2=value2故此后端在取多少后,设拓展解码。请求类似于下这样(无关的要求头在本文中还看看略掉了):

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;其次,提交的数码以
key1=val1&key2=val2 的法子开展编码,key 和 val 都开展了 URL
转码。大部分劳务端语言都对这种艺术有不行好之支撑。例如 PHP 中,$_POST[‘title’]
可以赢得到 title 的价值,$_POST[‘sub’] 可以获取 sub
数组。

无数时段,我们所以 Ajax
提交数据经常,也是以这种方式。例如 JQuery 和
QWrap 的 Ajax,Content-Type
默认值都是「application/x-www-form-urlencoded;charset=utf-8」。

style=”font-family: Microsoft YaHei;”>注意:若表单中来文件,则仅仅留下文件称。

multipart/form-data

即又是一个宽广的 POST
数据交由的办法。我们采用表单上污染文书时,必须吃 <form> 表单的
enctype 等于 multipart/form-data。直接来拘禁一个请求示例:

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"

有限责任公司
------WebKitFormBoundaryaqWXpQYCfMbAHgPh
Content-Disposition: form-data; name="unifiedSocialCreditCode"

91530700781667237G
------WebKitFormBoundaryaqWXpQYCfMbAHgPh--

注意:

  • 相似的话,methodenctype是少数只例外的互不影响的特性,但每当传文书时,method得要指定为POST,否则文件才剩余filename了;

  • 当没招文书时,enctype会改回默认的application/x-www-form-urlencoded

本条例子稍微复杂点。首先生成为了一个
boundary 用于私分不同之字段,为了避免与本文内容还,boundary
很丰富深复杂。然后 Content-Type 里指明了数额是以 multipart/form-data
来编码,本次请求的 boundary
是呀内容。消息主体里以字段个数又分为多个组织类似的组成部分,每部分还是以
--boundary
开始,紧接着是情叙述信息,然后是回车,最后是字段具体内容(文本或二进制)。如果传输的凡文件,还要包含文件名和文件类型信息。消息主体最后以
--boundary-- 标示了。关于 multipart/form-data 的详尽定义,请往
rfc1867 查看。

这种措施一般用来达到传文书,各大服务端语言对她也保有好的支持。

地方提到的立刻有限种植 POST
数据的不二法门,都是浏览器原生支持的,而且目前业内中原生 <form>
表单也单独支持即时片种方法(通过
<form> 元素的 enctype 属性指定,默认为
application/x-www-form-urlencoded。其实 enctype 还支持
text/plain,不过用得不得了少)。

乘机越来越多之 Web
站点,尤其是 WebApp,全部运 Ajax
进行多少交互之后,我们全可定义新的数据交由方式,给支付带动更多造福。

text/plain

依照键值对排列表单数据key1=value1\r\nkey2=value2,不进行转义。

style=”font-family: Microsoft YaHei;”>注意:若表单中起文件,则只留文件称。

application/json及其他MIME类型

application/json 这个
Content-Type
作为响应头大家肯定不生疏。实际上,现在愈来愈多之口把它看成请求头,用来报告服务端消息主体是序列化后的
JSON 字符串。由于 JSON 规范的风靡,除了低版本 IE
之外的每大浏览器还原生支持 JSON.stringify,服务端语言也都发处理 JSON
的函数,使用 JSON 不会见中上啊麻烦。

JSON
格式支持于键值对复杂得几近的结构化数据,这一点呢蛮有因此。记得我几年前开一个项目时,需要提交的数码层次非常特别,我便是把多少
JSON 序列化之后来付的。不过这我是管 JSON 字符串作为
val,仍然在键值对里,以 x-www-form-urlencoded 方式交给。

Google 的
AngularJS 中之 Ajax 功能,默认就是付诸 JSON
字符串。例如下面就段代码:

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

最后发送的呼吁是:

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

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

这种方案,可以一本万利之交付复杂的结构化数据,特别符合
RESTful 的接口。各大抓包工具而 Chrome
自带的开发者工具、Firebug、Fiddler,都见面因为树形结构展示 JSON
数据,非常好。但也闹头服务端语言还尚无支持这种方式,例如 php
就无法透过 $_POST
对象由者的请求被落内容。这时候,需要好下手处理下:在求求头中
Content-Type 为 application/json 时,从 php://input
里获得原始输入流,再 json_decode 成对象。一些 php
框架已初步这么做了。

自 AngularJS
也可以安排也以 x-www-form-urlencoded
方式交给数据。如发生需要,可以参考当即篇稿子。

 

此外,还欲验证表单数据编码类型application/json,已经被W3C遗弃(详见HTML
JSON Form
Submission),建议不要以<form enctype="...">着运用了,即采用了要浏览器不支持,也会见交替成application/x-www-form-urlencoded
同理,其余的MIME类型,也不支持,均会交替成默认编码application/x-www-form-urlencoded

注:1.MIME (Multipurpose
Internet Mail Extensions)
是讲述消息内容类型的因特网标准。

2.MIME
信息会包含文本、图像、音频、视频与另应用程序专用的多少。

思使询问详细的Mime
类型列表,请参考《W3school:MIME
参考手册》

总结

所以,enctype得认为就是是表单数据的content type(MIME type),只不过其取值不能够就此除了上面提到的老三单,否则会变成为默认的编码。

可参考地址:《四种植常见的 POST
提交数据方式》

相关文章