无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家。教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家。点这里可以跳转到教程。

首先来了解什么是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请求,那这个请求自然就是由这些原始的方法演变而来的,具体如何演变且看下文:

  • multipart/form-data的基础是post请求,即基于post请求来实现的
  • multipart/form-data形式的post与普通post请求的不同之处体现在请求头,请求体2个部分

multipart/form-data请求头:

必须包含Content-Type信息,且其值也必须规定为multipart/form-data,同时还需要规定一个内容分割符用于分割请求体中不同参数的内容(普通post请求的参数分割符默认为&,参数与参数值的分隔符为=)。具体的头信息格式如下:

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

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

样例:

Content-Type: multipart/form-data; boundary=--------------------56423498738365

multipart/form-data请求体:

它也是一个字符串,不过和普通post请求体不同的是它的构造方式。普通post请求体是简单的键值对连接,格式如下:

k1=v1&k2=v2&k3=v3

而multipart/form-data则是添加了分隔符、参数描述信息等内容的构造体。具体格式如下:

${bound}
Content-Disposition: form-data; name="Filename"HTTP.pdf
${bound}
Content-Disposition: form-data; name="file000"; filename="HTTP协议详解.pdf"
Content-Type: application/octet-stream%PDF-1.5
file content
%%EOF
${bound}
Content-Disposition: form-data; name="Upload"Submit Query
${bound}--

其中${bound}就是之前请求头信息中的分割符,如果头信息中规定为123,那么这里也要为123(其作用等同于普通post请求中的&符号的作用,即分割参数)。很明显如果按照之前请求头的样例来,则这里的${bound}值应该替换为--------------------56423498738365,注意最后一个${bound}后需要固定添加两个横杆--

另外可以很容易的看出,这个请求体被分隔符划分为3个部分,而每个部分其实就是一个参数的键值描述(其作用等同于普通post请求的k1=v1的部分),但对参数信息的描述可以比普通post请求更加丰富,这就是为什么multipart/form-data能发送文件的原因。

每一个部分都是以分隔符开始的,接着是该部分内容的描述信息,然后是一个回车,最后是描述信息的具体内容。如果传送的内容是一个文件的话,那么还会包含文件名信息,以及文件内容的类型;上面的第二个小部分其实是一个文件体的结构,最后的分割符后会以--结尾,表示请求体结束。

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

参考资料:

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

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

分析工具:httpAnalyzer

==========================纯文本格式分割线=========================

Header = {"Content-type" : "multipart/form-data, boundary=AaB03x"}Data =  "--AaB03x\r\n" +"content-disposition: form-data; name=\"field1\"\r\n" +"\r\n" + "Joe Blow\r\n" +"--AaB03x\r\n" +"content-disposition: form-data; name="pics"; filename=\"file1.txt\"\r\n" +"Content-Type: text/plain\r\n" +"\r\n" +"...binary contents of file1.txt ...\r\n" +"--AaB03x--\r\n"

其中:...binary contents of file1.txt ... 要替换成真实的文件二进制内容。

===========================请求代码分割线============================

如何使用Python发送multipart/form-data请求,请查看 http://blog.csdn.net/five3/article/details/74913742

HTTP协议之multipart/form-data请求分析相关推荐

  1. 1. 恼人的Multipart form data

    文章目录 1. 概述 2. 问题 3. 解决方案 3.1 解决方案一 3.2 解决方案二 3.3 解决方案三 4. 总结 1. 概述 我目前在公司负责开放平台项目,使用spring-cloud-gat ...

  2. http协议的Request Payload 和 Form Data 的区别

    Request Payload VS Form Data 前端请求 我看了前端发起的请求,请求正文并不是我熟悉的 Form Data,而是 Request Payload.如图注意下面两个请求的 Co ...

  3. python requests form data_Python爬虫:Request Payload和Form Data的简单区别说明

    Request Payload 和 Form Data 请求头上的参数差别在于: Content-Type Form Data Post表单请求 代码示例 headers = { "Cont ...

  4. flux读取不到数据_WebFlux 中form data获取不到参数问题

    Spring WebFlux 中, request.queryParams 只能获取到 查询参数, 对于 form 提交的参数无法进行参数自动装载 处理方式有两种: 一. 自定义 ArgumentRe ...

  5. 【转】HTTP协议之multipart/form-data请求分析

    原文链接:http://blog.csdn.net/five3/article/details/7181521 首先来了解什么是multipart/form-data请求: 根据http/1.1 rf ...

  6. vue axios POST请求中参数以form data和request payload形式的原因

    HTTP请求中,如果是get请求,那么表单参数以name=value&name1=value1的形式附到url的后面,如果是post请求,那么表单参数是在请求体中,也是以name=value& ...

  7. 获取referer中的请求参数_Servlet获取AJAX POST请求中参数以form data和request payload形式传输的方法...

    本文实例讲述了Servlet获取AJAX POST请求中参数以form data和request payload形式传输的方法.分享给大家供大家参考,具体如下: HTTP请求中,如果是get请求,那么 ...

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

    HTTP请求中,假设是get请求,那么表单參数以name=value&name1=value1的形式附到url的后面,假设是post请求,那么表单參数是在请求体中,也是以name=value& ...

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

    今天在做项目的时候 需要往api中发送一个json格式的对象,但是怎么改都不行,当然,使用的vue 的 http方法. 而且,开始使用时 vue-resource中post请求时的一个坑,vue-re ...

最新文章

  1. 1.3. redis-cli - Command-line client to redis-server
  2. 人工智能AI实战100讲(二十)-先拍照后对焦,基于深度估计的景深编辑与背景虚化
  3. RUNOOB python练习题3
  4. 修改wap游戏服务器,修改wap游戏服务器
  5. CentOS下rpm命令使用
  6. android远程调用github仓库的aar文件
  7. tableau两个不同的图合并_【书稿摘要】Tableau地图函数(下)
  8. URI、URL与URN【定义+联系】
  9. ***服务现状的理解
  10. static_cast、dynamic_cast、const_cast和reinterpret_cast总结(转)
  11. Docker 从零开始制作基础镜像[centos]
  12. Java中遍历Map集合的3种方式
  13. 【小白】用python写一个单向聊天室
  14. 常用Firefox插件大全
  15. 【论文阅读笔记】GNN入门(A Gentle Introduction to Graph Neural Networks)
  16. 011 数据恢复(原理)
  17. zblog访问记录v2.5.0
  18. 汇编创建Win32窗体
  19. 哈佛大学开放课程:《公正:该如何做是好?》6
  20. 从Redis List的各种使用场景来深刻理解它

热门文章

  1. 统计虚词使用不同聚类方法判别红楼梦作者
  2. 思科路由器PPOE client+NAT解决地址回流问题测试
  3. 百度前200页部分答案(初稿)
  4. PSP1000/2000/3000 PSPgo全主机介绍(1)
  5. Django之爱鲜蜂项目开发 day02 (二)
  6. Command terminated by signal 11
  7. Pktgen-DPDK使用说明
  8. XMind的简单使用
  9. POP3协议是什么?底层原理是什么?
  10. 项目中的Ulua使用感想