问题描述
事情是这样的,我在使用ajax+FormData对象提交数据的时候,使用request.setRequestHeader(“Content-Type”, “application/x-www-form-urlencoded”); 但服务端接受的数据却是multipart/form-data编码的,还自带boundary。
Form的三种encrypt
- application/x-www-urlencoded
- multipart/form-data
- text-plain
首先,encrypt属性值是在http传输数据位于http头部Content-Type的,并且只是客户端提交数据有效,服务端不使用这几个值。客户端接收到这几个值会自动忽略(浏览器)。
在1995年,ietf 出台了 rfc1867,也就是《RFC 1867 -Form-based File Upload in HTML》,用以支持文件上传。所以 Content-Type 的类型扩充了multipart/form-data 用以支持向服务器发送二进制数据。因此,发送 POST 请求时候,表单 属性 enctype 共有二个值可选,这个属性管理的是表单的 MIME 编码:
① application/x-www-form-urlencoded (默认值)
② multipart/form-data
注:form 表单中 enctype 的默认值是 enctype=“application/x- www-form-urlencoded”.
Example
application/x-www-urlencoded
POST http://127.0.0.1/login.do HTTP/1.0
Accept: image/gif, image/jpeg, image/pjpeg, */*
Accept-Language: en-us,zh-cn;q=0.5
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
Content-Length: 28
username=admin&password=1234
multipart/form-data
PS C:\Users\Administrator\Desktop\Projects\poemServer\src\serve\golang> go run .\main.go
multipart/form-data; boundary=----WebKitFormBoundaryKIziqjuNgPfCj1Mw
------WebKitFormBoundaryKIziqjuNgPfCj1Mw
Content-Disposition: form-data; name="poemname"
1234
------WebKitFormBoundaryKIziqjuNgPfCj1Mw
Content-Disposition: form-data; name="poemclass"
叙事诗
------WebKitFormBoundaryKIziqjuNgPfCj1Mw
Content-Disposition: form-data; name="poetname"
4567
------WebKitFormBoundaryKIziqjuNgPfCj1Mw
Content-Disposition: form-data; name="poemhist"
宋
------WebKitFormBoundaryKIziqjuNgPfCj1Mw
Content-Disposition: form-data; name="poemtags"
豪迈;不羁
------WebKitFormBoundaryKIziqjuNgPfCj1Mw
Content-Disposition: form-data; name="conditionlogical"
与或非
------WebKitFormBoundaryKIziqjuNgPfCj1Mw
Content-Disposition: form-data; name="poemContent_kaipianci"
a
------WebKitFormBoundaryKIziqjuNgPfCj1Mw
Content-Disposition: form-data; name="poemContent_content"
w
------WebKitFormBoundaryKIziqjuNgPfCj1Mw
Content-Disposition: form-data; name="poemContent_comment"
s
------WebKitFormBoundaryKIziqjuNgPfCj1Mw
Content-Disposition: form-data; name="poemContent_history"
d
------WebKitFormBoundaryKIziqjuNgPfCj1Mw--
然后再在服务端对数据进行解析,使用boundary来split操作,如golang的http.Request.ParseMultipartForm操作。
总结
- 这几个字段是用来http向服务端提交数据用的。
- multipart/form-data存在的意义在于一定程度上减少cs交互数, 一个连接请求发送多部分content,支持二进制传输
- 对于默认application/x-www-urlencoded编码。
- 对于FormData只支持multipart/form-data编码,并且不需要设置Content-Type,自动设置。