requests.post处理Content-Type: multipart/form-data的请求
前几天遇到一个需求,要调用一个接口发送请求,抓包之后得到的数据是这样的
上网看了一些资料得知,原来这个接口的数据是通过multipart/form-data格式传过去的,multipart/form-data就是使用表单上传文件,是基于post方法来传递数据的,并且其请求内容格式为Content-Type: multipart/form-data,用来指定请求内容的数据编码格式。另外,该格式会生成一个boundary
字符串来分割请求头与请求体的,具体的是以一个boundary=${boundary}
来进行分割。
那么这个请求该怎么发送呢?
我们一般提交表单数据是这样的
import requests url = 'http://www.httpbin.org/post' data = {
'username':'jack',
'password':'rose',
}
r = requests.post(url, data=data)
print(r.text)
但是这种方式只能提交Content-Type: application/x-www-form-urlencoded格式的数据,像multipart/f orm-data这种格式的,就需要通过发文件的方式了
查询一些资料,我们一般用post上传文件就用以下这种方式:
import requests url = 'http://www.httpbin.org/post'
files = {'file': open('/home/test.jpg', 'rb')}
#files = {'file': ('report.jpg', open('/home/test.mpg', 'rb'))} #显式的设置文件名 r = requests.post(url, files=files)
而如图这样已经知道form-data的name的请求就把上面的'file'改成form-data的name
import requests url = 'http://www.httpbin.org/post'
files = {'xmlhead': (None, 'hello'),'xmlbody':(None,'world'),'rspxml':(None,'')}
r = requests.post(url, files=files)
这种是把字符串按照文件方式传过去,因为不需要设置文件名,所以字符串前面为None(若需要设置文件名,就把None改为文件名)。
抓包查看一下结果
和用浏览器发送的请求一样了(两边的boundary因为截图截了两次,大家不要在意),只要我们再添加一些headers信息,就可以达到预期结果。
接下来我们来看看复杂一点的传参:
import requests
url = "http://www.httpbin.org/post"
data = {
'age':28,
'city':'深圳',
}
# 折中方案,参数按如下方式组织,也是模拟multipart/form-data的核心
params = {"username": ('username.txt', open('1.txt','r')), "password": (None, "abcd1234"),"location":('location.txt','福田区'),"picture":('1.jpg',open(r'C:\\Users\\1.jpg','rb'))} res = requests.post(url, data=data,files=params)
如果发送这个请求,那么抓包的参数是怎么样的呢?
结果是
--1617b70c8a3c4bc49a9a3ae659fb224f
Content-Disposition: form-data; name="age"
28
--1617b70c8a3c4bc49a9a3ae659fb224f
Content-Disposition: form-data; name="city"
深圳
--1617b70c8a3c4bc49a9a3ae659fb224f
Content-Disposition: form-data; name="username"; filename="username.txt"
hello world!
--1617b70c8a3c4bc49a9a3ae659fb224f
Content-Disposition: form-data; name="password"
abcd1234
--1617b70c8a3c4bc49a9a3ae659fb224f
Content-Disposition: form-data; name="location"; filename="location.txt"
福田区
--1617b70c8a3c4bc49a9a3ae659fb224f
Content-Disposition: form-data; name="picture"; filename="1.jpg
**二进制数据就不显示了**
--1617b70c8a3c4bc49a9a3ae659fb224f
data里的数据也按照文件方式过去了,并且key就对应form-data里的name,有文件名的数据,form-data还会有filename属性。小伙伴们,现在知道怎么进行multipart/form-data的请求了吗
requests.post处理Content-Type: multipart/form-data的请求的更多相关文章
- org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'multipart/form-data;boundary=----WebKitFormBoundaryRAYPKeHKTYSNdzc1;charset=UTF-8' not supported
原文:https://www.cnblogs.com/yueli/p/7552888.html 最近同事在做一个图片上传功能.在入参 body 中同时传入文件和其它基本信息结果出现如题异常.在此记录下 ...
- Sending forms through JavaScript[form提交 form data]
https://developer.mozilla.org/en-US/docs/Learn/HTML/Forms/Sending_forms_through_JavaScript As in the ...
- html5 file upload and form data by ajax
html5 file upload and form data by ajax 最近接了一个小活,在短时间内实现一个活动报名页面,其中遇到了文件上传. 我预期的效果是一次ajax post请求,然后在 ...
- http 请求参数之Query String Parameters、Form Data、Request Payload
Query String Parameters 当发起一次GET请求时,参数会以url string的形式进行传递.即?后的字符串则为其请求参数,并以&作为分隔符. 如下http请求报文头: ...
- (转载)http协议的Request Payload 和 Form Data 的区别
我正在开发的项目前端和后端是完全独立的,通过配置 webpack 的 proxy 将前端请求跨域代理到后台服务.昨天发现,我前端执行 post 请求,后台 springmvc 的 @RequestMa ...
- Request Payload 和 Form Data 的区别
概述 我正在开发的项目前端和后端是完全独立的,通过配置 webpack 的 proxy 将前端请求跨域代理到后台服务.昨天发现,我前端执行 post 请求,后台 springmvc 的 @Reques ...
- the request doesn't contain a multipart/form-data or multipart/form-data stream, content type header
the request doesn't contain a multipart/form-data or multipart/form-data stream, content type header ...
- Sending HTML Form Data
public Task<HttpResponseMessage> PostFormData(){ // Check if the request contains multipart/fo ...
- 表单提交数据格式form data
前言: 最近遇到的最多的问题就是表单提交数据格式问题了. 常见的三种表单提交数据格式,分别举例说明:(项目是vue的框架) 1.application/x-www-form-urlencoded 提交 ...
- requests接口自动化5-表单参数形式的post请求:data
post请求相对于get请求多一个body部分,body部分常见的数据类型有以下四种(注意是常见的,并不是只有4种) application/x-www-form-urlencoded(表单形式) a ...
随机推荐
- HTML CSS表格如何控制上下间距
css:td{margin-top:10px; 上间距margin-right:10px; 右间距margin-bottom:10px; 下间距margin-left:10px; 左间距}
- IDEA15入门常用设置
打开IDEA设置的快捷键:Ctrl + Alt + S 打开选中的项目属性快捷键:Shift + Ctrl + Alt + S 1.IDEA默认不会使用我们独立安装的Maven配置,需要手动设置,并且 ...
- CentOS系统bash: groupadd: command not found问题
如果我们需要在CentOS执行新建用户组命令的时候,需要进入到ROOT权限,如果你用以下命令: 1 su2 su root 进入到ROOT账户,那么会出现上述的错误信息:“bash: groupadd ...
- 《从零开始学Swift》学习笔记(Day 23)——尾随闭包
原创文章,欢迎转载.转载请注明:关东升的博客 闭包表达式可以作为函数的参数传递,如果闭包表达式很长,就会影响程序的可读性.尾随闭包是一个书写在函数括号之后的闭包表达式,函数支持将其作为最后一个参数调用 ...
- #1560 : H国的身份证号码II(dp+矩阵快速幂)
#1560 : H国的身份证号码II 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 H国的身份证号码是一个N位的正整数(首位不能是0).此外,由于防伪需要,一个N位正整 ...
- WCF基础之传输
WCF中使用的主要传输的方式有HTTP,TCP和命名管道. 绑定包括可选的协议绑定元素(如安全),必需的编码绑定元素和必须的传输协定绑定元素三个部分,而由传输方式则是由传输绑定元素来决定的. HTTP ...
- SpringBoot-------实现多数据源Demo
之前SpringBoot出来时候就看了下Springboot,感觉的确精简掉了配置文件! 还是很方便的!没办法,我只是个菜鸟! 什么怎么启动Springboot什么的就不说了, 具体的Demo地址我都 ...
- 简单echars说明和使用
官方API:http://echarts.baidu.com/echarts2/doc/doc.htm 1.AMD规范的加载器——esl.js,这是什么? 答:关于AMD规范可以参考阮一峰的这篇文章 ...
- 线程锁、threading.local(flask源码中用的到)、线程池、生产者消费者模型
一.线程锁 线程安全,多线程操作时,内部会让所有线程排队处理.如:list/dict/Queue 线程不安全 + 人(锁) => 排队处理 1.RLock/Lock:一次放一个 a.创建10个线 ...
- linux虚拟机能ping通windows主机,windows主机ping不通linux虚拟机的解决办法
分三步: 1.虚拟机网络连接方式选择Nat