转:HTTP协议--- multipart/form-data请求分析

转自:http://blog.csdn.net/five3/article/details/7181521

首先来了解什么是multipart/form-data请求:

根据http/1.1 rfc 2616的协议规定,我们的请求方式只有OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE等,那为为何我们还会有multipart/form-data请求之说呢?这就要从头来说了。

http协议大家都知道是规定了以ASCII码传输,建立在tcp、ip协议之上的应用层规范,规范内容把http请求分为3个部门:状态行,请求头,请求体。所有的方法、实现都是围绕如何运用和组织这三部分来完成的。换句话来说就是万变不离其中,只要我们了解了http请求的组成部分后,自然就可以应变任何实际工作中的需求和问题了。

关于状态行,请求头,请求体等三部分的具体内容,大家可以参考官方的协议文档http://www.faqs.org/rfcs/rfc2616.html,这里主要分析multipart/form-data请求具体是怎么一回事。

既然http协议本身的原始方法不支持multipart/form-data请求,那这个请求自然就是由这些原始的方法演变而来的,具体如何演变且看下文:

1、multipart/form-data的基础方法是post,也就是说是由post方法来组合实现的

2、multipart/form-data与post方法的不同之处:请求头,请求体。

3、multipart/form-data的请求头必须包含一个特殊的头信息:Content-Type,且其值也必须规定为multipart/form-data,同时还需要规定一个内容分割符用于分割请求体中的多个post的内容,如文件内容和文本内容自然需要分割开来,不然接收方就无法正常解析和还原这个文件了。具体的头信息如下:

[html] view plain copy

  1. Content-Type: multipart/form-data; boundary=${bound}

//其中${bound} 是一个占位符,代表我们规定的分割符,可以自己任意规定,但为了避免和正常文本重复了,尽量要使用复杂一点的内容。如:--------------------56423498738365

4、multipart/form-data的请求体也是一个字符串,不过和post的请求体不同的是它的构造方式,post是简单的name=value值连接,而multipart/form-data则是添加了分隔符等内容的构造体。具体格式如下:

[html] view plain copy

  1. --${bound}
  2. Content-Disposition: form-data; name="Filename"
  3. HTTP.pdf
  4. --${bound}
  5. Content-Disposition: form-data; name="file000"; filename="HTTP协议详解.pdf"
  6. Content-Type: application/octet-stream
  7. %PDF-1.5
  8. file content
  9. %%EOF
  10. --${bound}
  11. Content-Disposition: form-data; name="Upload"
  12. Submit Query
  13. --${bound}--


其中${bound}为之前头信息中的分割符,如果头信息中规定为123,那么这里也要为123,;可以很容易看出,这个请求体是多个相同的部分组成的:每一个部分都是以--加分隔符开始的,然后是该部分内容的描述信息,然后一个回车,然后是描述信息的具体内容;如果传送的内容是一个文件的话,那么还会包含文件名信息,以及文件内容的类型。上面的第二个小部分其实是一个文件体的结构,最后会以--分割符--结尾,表示请求体结束。

综上,可以知道要发送一个multipart/form-data的请求,其实任何支持post请求的工具或语言都可以支持,只是自己要稍微包装一下便可。

参考资料:

百度百科: http://baike.baidu.com/view/9472.htm

http1.1协议规范: http://www.faqs.org/rfcs/rfc2616.html

分析工具:httpAnalyzer

时间: 2024-11-25 21:29:38

转:HTTP协议--- multipart/form-data请求分析的相关文章

http协议get、post请求分析及用HttpRequester测试的报错及可能原因

1.get.post区别 Get Post 获取/提交数据 主要获取数据,不修改数据 主要提交数据,可修改数据 是否需要form表单 不一定 需要 安全性 查询字符串会显示在地址栏的URL中,不安全.(用户密码类信息会显示在URL中) 数据不会显示在URL中,但传递敏感信息仍需加密 缓存 支持 不支持 传递数据限制 不适合大型数据集 不适合复杂性数据 URL长度限制 特定浏览器和服务器对URL长度有限制 理论上不限制,但服务器对数据大小限制 2.报错类型及可能的原因 200 ok,但返回数据与预

HTTP协议之multipart/form-data请求分析

首先来了解什么是multipart/form-data请求: 根据http/1.1 rfc 2616的协议规定,我们的请求方式只有OPTIONS.GET.HEAD.POST.PUT.DELETE.TRACE等,那为为何我们还会有multipart/form-data请求之说呢?这就要从头来说了. http协议大家都知道是规定了以ASCII码传输,建立在tcp.ip协议之上的应用层规范,规范内容把http请求分为3个部门:状态行,请求 头,请求体.所有的方法.实现都是围绕如何运用和组织这三部分来完

AJAX POST请求中參数以form data和request payload形式在servlet中的获取方式

HTTP请求中,假设是get请求,那么表单參数以name=value&name1=value1的形式附到url的后面,假设是post请求,那么表单參数是在请求体中,也是以name=value&name1=value1的形式在请求体中.通过chrome的开发人员工具能够看到例如以下(这里是可读的形式,不是真正的HTTP请求协议的请求格式): get请求: RequestURL:http://127.0.0.1:8080/test/test.do?name=mikan&address=

AJAX POST请求中参数以form data和request payload形式在servlet中的获取方式

HTTP请求中,如果是get请求,那么表单参数以name=value&name1=value1的形式附到url的后面,如果是post请求,那么表单参数是在请求体中,也是以name=value&name1=value1的形式在请求体中.通过chrome的开发者工具可以看到如下(这里是可读的形式,不是真正的HTTP请求协议的请求格式): get请求: RequestURL:http://127.0.0.1:8080/test/test.do?name=mikan&address=str

HTTP请求中的Form Data与Request Payload的区别

前端开发中经常会用到AJAX发送异步请求,对于POST类型的请求会附带请求数据.而常用的两种传参方式为:Form Data 和 Request Payload. GET请求 使用get请求时,参数会以key=value的形式拼接在请求的url后面.例如: http://m.baidu.com/address/getlist.html?limit=50&offset=0&t=1502345139870 但是受限于请求URL的长度限制,一般参数较少时会使用get请求. POST请求 当参数数量

Vue-resource中post请求将data数据以request payload转换为form data的形式

今天在做项目的时候 需要往api中发送一个json格式的对象,但是怎么改都不行,当然,使用的vue 的 http方法. 而且,开始使用时 vue-resource中post请求时的一个坑,vue-resource中post发送的数据默认以request payload的形式,而一般我们使用的都是form data的形式. 后来发现,只需要在main.js中加入: Vue.http.options.emulateJSON = true; Vue.http.options.headers = { '

【转】form data和request payload的区别

HTML <form> 标签的 enctype 属性 在下面的例子中,表单数据会在未编码的情况下进行发送: <form action="form_action.asp" enctype="text/plain">   <p>First name: <input type="text" name="fname" /></p>   <p>Last name: 

form data和request payload的区别

HTML <form> 标签的 enctype 属性 在下面的例子中,表单数据会在未编码的情况下进行发送: <form action="form_action.asp" enctype="text/plain">   <p>First name: <input type="text" name="fname" /></p>   <p>Last name: 

【报文】理解HTTP协议的Request/Response(请求响应)模型

[报文]理解HTTP协议的Request/Response(请求响应)模型 系列目录 [简介]"请求/响应"模型 http://www.cnblogs.com/engraver-lxw/p/7550514.html [原理]理解HTTP协议的Request/Response(请求响应)模型 http://www.cnblogs.com/engraver-lxw/p/7550691.html [报文]理解HTTP协议的Request/Response(请求响应)模型--当前 http:/