POST请求用于向服务器提交数据,比如增删改数据,提交一个表单新建一个用户、或修改一个用户等。
对于POST请求,我们可以通过浏览器开发者工具或者其他外部工具来进行抓包,得到请求的URL、请求头(request headers)以及请求的表单data信息,这三样恰恰是我们用Requests模拟POST请求时需要的。
关于请求头的配置和GET请求是一样的,都是定义headers
属性即可。
而关于POST请求提交的参数,是和GET请求是不一样的。
post请求四种传送正文方式:
这四种提交数据的方式,是在请求头Content-Type
属性中来定义。
Reqeusts支持以application/x-www-form-urlencoded
数据格式发送POST请求(标准的POST请求数据格式,默认),只需要将请求的参数构造成一个字典,然后传给requests.post()
的data参数即可。
示例:
- """
- 1.学习目标
- 必须掌握requests库发送post请求方法
- 2.HTTP协议中post请求参数类型
- requests.post(url, data=None, json=None, **kwargs)
- 根据不同的请求参数类型分为如下几种:
- x-www-form-data-urlencoded
- raw_json格式
- form-data
- binary
- 3.json格式
- # 1.导入requests库
- # 2.明确请求地址
- # 3.明确请求参数
- data = {key:value} 字典格式
- # 4.发送请求
- requests.post(url=url,json=data)
- 4.需求
- 通过访问http://httpbin.org/post接口,验证post参数类型
- """
- # 1.导入requests库
- import requests
- import json
-
- # 2.明确请求地址
- url = "http://httpbin.org/post"
- # 3.明确请求参数
- data = {
- "dep_id": "T01",
- "dep_name": "Test学院",
- "master_name": "Test-Master",
- "slogan": "Here is Slogan"
- }
- # 4.发送请求
- response = requests.post(url=url, data=data)
-
- # 将python对象转换为json字符串(格式化返回数据)
- result = json.dumps(response.json(), indent=2, ensure_ascii=False)
- # print(type(result)) # 字符串类型
- print(result)
-
- """
- 返回结果:
- {
- "args": {},
- "data": "",
- "files": {},
- ****************主要看这里
- "form": {
- "dep_id": "T01",
- "dep_name": "Test学院",
- "master_name": "Test-Master",
- "slogan": "Here is Slogan"
- },
- ***********************
- "headers": {
- "Accept": "*/*",
- "Accept-Encoding": "gzip, deflate",
- "Content-Length": "88",
- *****************主要看这里
- "Content-Type": "application/x-www-form-urlencoded",
- *****************
- "Host": "httpbin.org",
- "User-Agent": "python-requests/2.18.4",
- "X-Amzn-Trace-Id": "Root=1-5ff401e3-1553596b7788e77e275c4772"
- },
- "json": null,
- "origin": "106.35.9.12",
- "url": "http://httpbin.org/post"
- }
- """
说明:
Content-Type
属性为application/x-www-form-urlencoded
application/x-www-form-urlencoded
格式发送数据,requests.post(url=url, data=data)
方法中一定要使用data变量来接收参数。application/x-www-form-urlencoded
数据格式的POST请求。(也可以在请求头中明确一下Content-Type
属性,但没必要。)RAW的原意就是“未经加工”。换句话说RAW方式使用的是纯字符串的数据上传方式,所以在发送POST请求之前,可能需要手工的把一些JSON格式的数据转换成字符串的(加两单引号),在进行提交。
RAW数据格式的POST请求有两种:
下面我们一一说明:
(1)json格式文本(application/json)
- # 1.导入requests库
- import requests
- import json
-
- # 2.明确请求地址
- url = "http://httpbin.org/post"
- # 3.明确请求参数
- data = {
- "data": [
- {
- "dep_id": "T01",
- "dep_name": "Test学院",
- "master_name": "Test-Master",
- "slogan": "Here is Slogan"
- }
- ]
- }
-
- # headers = {"Content-Type": "application/json"}
-
- # 4.发送请求
- response = requests.post(url=url, json=data)
- print(response) # <Response [200]>
- print(response.text)
-
-
- """
- 返回结果:
- {
- "args": {},
- "data": "{\"data\": [{\"dep_id\": \"T01\", \"dep_name\": \"Test\\u5b66\\u9662\", \"master_name\": \"Test-Master\", \"slogan\": \"Here is Slogan\"}]}",
- "files": {},
- "form": {},
- "headers": {
- "Accept": "*/*",
- "Accept-Encoding": "gzip, deflate",
- "Content-Length": "119",
- **************************主要看这里
- "Content-Type": "application/json",
- **************************
- "Host": "httpbin.org",
- "User-Agent": "python-requests/2.18.4",
- "X-Amzn-Trace-Id": "Root=1-5ff40a9d-6a6f19d272ba4c1b40ff7bbb"
- },
- **************************主要看这里
- "json": {
- "data": [
- {
- "dep_id": "T01",
- "dep_name": "Test\u5b66\u9662",
- "master_name": "Test-Master",
- "slogan": "Here is Slogan"
- }
- ]
- },
- **************************
- "origin": "106.35.9.12",
- "url": "http://httpbin.org/post"
- }
- """
说明:
Content-Type
属性为application/json
。application/json
格式发送数据,requests.post(url=url, json=data)
方法中一定要使用json变量来接收参数。application/json
数据格式的POST请求。(也可以在请求头中明确一下Content-Type
属性,但没必要。)注意:
这里我们可以发现Requests模拟post请求时,请求头格式为application/x-www-form-urlencoded与application/json的主要差别在于请求主体的构造格式(前者是键值对,后者是JSON串),前者直接用字典传入,后者用json.dumps()函数将字典转为JSON串即可。
也就是说在有需要的时候json模块下的dumps函数可以将dict转换为str。
- # 1.导入requests库
- import requests
- import json
-
- # 2.明确请求地址
- url = "http://httpbin.org/post"
- # 3.明确请求参数
- data = '
' \ - '
' \ - '
菜鸟教程 ' \ - '
www.runoob.com ' \ - '' \
- '
' \ - '
Google ' \ - '
www.google.com ' \ - '' \
- ''
-
- # requests.post方法中适用json变量来接收数据,
- # 默认是"Content-Type": "application/json",
- # 这里我们需要重新声明一下Content-Type属性。
- headers = {'Content-type': 'text/xml'}
-
- # 4.发送请求
- # 如果数据用data变量来接收会报错。
- response = requests.post(url=url, json=data, headers=headers)
- print(response) # <Response [200]>
- # print(response.text)
-
- # 将python对象转换为json字符串(格式化返回数据)
- result = json.dumps(response.json(), indent=2, ensure_ascii=False)
- # print(type(result)) # 字符串类型
- print(result)
-
- """
- 返回结果:
- {
- "args": {},
- "data": "\"
\\u83dc\\u9e1f\\u6559\\u7a0b www.runoob.com Google www.google.com \"", - "files": {},
- "form": {},
- "headers": {
- "Accept": "*/*",
- "Accept-Encoding": "gzip, deflate",
- "Content-Length": "149",
- **************************主要看这里
- "Content-Type": "text/xml",
- **************************
- "Host": "httpbin.org",
- "User-Agent": "python-requests/2.18.4",
- "X-Amzn-Trace-Id": "Root=1-5ff40fa5-21a79b532b1ccf6d20173fd7"
- },
- **************************主要看这里
- "json": "<sites><site><name>菜鸟教程</name><url>www.runoob.com</url></site><site><name>Google</name><url>www.google.com</url></site></sites>",
- **************************
- "origin": "106.35.9.12",
- "url": "http://httpbin.org/post"
- }
- """
说明:
Content-Type
属性。application/json
一样。提示:其实raw格式数据可以上传text、json、xml、html等纯字符的文本。
使用binary格式的正文发送POST请求,是直接使用二进制流进行数据传输,多用于上传单个图片或图片。
也可以用于把请求的参数放入一个文件中,进行数据的提交。
示例如下:
- """
- 1.学习目标
- 掌握requests发送post请求
- 2.HTTP协议中post请求参数类型
- x-www-form-data-urlencoded
- raw_json格式
- form-data
- binary
- 3.binary格式
- # 1.明确请求地址
- # 2.明确请求参数
- data = {"files":open("文件名","rb")} 字典格式
- # 3.发送请求
- requests.post(url= url,files=data)
- 4.需求
- http://httpbin.org/post
- """
- # 1.导入requests
- import requests
-
- # 2.请求地址
- url = "http://httpbin.org/post"
-
- # 3.请求参数
- # 读取文件中的数据作为参数进行提交。
- # key位置要写files,是规范
- # 也可以写其他的名字,不规范
- data = {"files": open("test.txt", "rb")}
-
- # 4.发送请求
- response = requests.post(url=url, files=data)
- print(response.text)
-
-
- """
- 请求结果如下:
- {
- "args": {},
- "data": "",
- **************************主要看这里
- "files": {
- "files": "username=\u5927\u5c0f\u59d0\r\npassword=test123456\r\nage=18"
- },
- **************************
- "form": {},
- "headers": {
- "Accept": "*/*",
- "Accept-Encoding": "gzip, deflate",
- "Content-Length": "192",
- **************************主要看这里
- "Content-Type": "multipart/form-data; boundary=351e0b73ea144694a9e9fdd1e10d2486",
- **************************
- "Host": "httpbin.org",
- "User-Agent": "python-requests/2.18.4",
- "X-Amzn-Trace-Id": "Root=1-5ff499ea-7ad42c4e6f056b44347b3c26"
- },
- "json": null,
- "origin": "106.35.9.12",
- "url": "http://httpbin.org/post"
- }
- """
说明:
Content-Type
属性为multipart/form-data
。application/json
格式发送数据,requests.post(url=url, files=data)
方法中一定要使用files变量来接收参数。requests.post()
方法的files
参数即可。multipart/form-data
数据格式的POST请求,多用于文件上传。
示例1:
- """
- 1.学习目标
- 掌握requests发送post请求
- 2.HTTP协议中post请求参数类型
- x-www-form-data-urlencoded
- raw_json格式
- form-data
- binary
- 3.form-data格式
- 使用files变量来接收数据,默认是使用form-data格式发送POST请求。
- 4.需求
- http://httpbin.org/post
- """
-
- import requests
-
- files = {'file1': open('logo.png', 'rb')}
- response = requests.post('http://127.0.0.1:9999/post', files=files)
- print(response.text)
-
-
- """
- 接口返回结果:
- {
- "args": {},
- "data": "",
- **************************主要看这里
- "files": {
- "file1": "data:application/octet-stream;base64,/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAgGBgcGBQgHerOCtwJPHpvQjoYqxmHighE/wO1YuuATgOKt9wGMd653WXlhe2xbcpauJjePjQYuZTOOk032eaYj+GgOQ+E1QCBj4UxtunNUFIjBmm5P05oBjLv99qoKgEpW9PSu1b0tAglXYOr2/uN4rtp6ZZay53n81IAlauN/pRH/2Q=="
- },
- **************************
- "form": {},
- "headers": {
- "Accept": "*/*",
- "Accept-Encoding": "gzip, deflate",
- "Connection": "keep-alive",
- "Content-Length": "394145",
- **************************主要看这里
- "Content-Type": "multipart/form-data; boundary=4efea05a2cf34e78a75508a1ebf000ec",
- **************************
- "Host": "127.0.0.1:9999",
- "User-Agent": "python-requests/2.18.4"
- },
- "json": null,
- "origin": "127.0.0.1",
- "url": "http://127.0.0.1:9999/post"
- }
- """
示例2:
我们也可以显式地设置文件名,文件类型和请求头:
- import requests
- # hangge.png 为图片名称
- files = {'file1': ('hangge.png', open('logo.png', 'rb'), 'image/png', {'Expires': '0'})}
- response = requests.post('http://127.0.0.1:9999/post', files=files)
- print(response.text)
-
-
- """
- 接口返回结果:
- {
- "args": {},
- "data": "",
- **************************主要看这里
- "files": {
- "file1": "data:image/png;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyacMkc0Yyc0UAf/Z"
- },
- **************************
- "form": {},
- "headers": {
- "Accept": "*/*",
- "Accept-Encoding": "gzip, deflate",
- "Connection": "keep-alive",
- "Content-Length": "7063",
- **************************主要看这里
- "Content-Type": "multipart/form-data; boundary=382e06cba6834118a1f1efd0ea2c45e3",
- **************************
- "Host": "127.0.0.1:9999",
- "User-Agent": "python-requests/2.18.4"
- },
- "json": null,
- "origin": "127.0.0.1",
- "url": "http://127.0.0.1:9999/post"
- }
- """
示例3:多文件上传
有时我们需要在一个请求中同时发送多个文件,同样使用 files 参数传入一个数组即可:
- import requests
- files = [
- ('file1', ('1.png', open('logo.png', 'rb'), 'image/png')),
- ('file2', ('2.png', open('logo.png', 'rb'), 'image/png'))
- ]
- response = requests.post('http://127.0.0.1:9999/post', files=files)
- print(response.text)
-
-
- """
- 接口返回结果:
- {
- "args": {},
- "data": "",
- **************************主要看这里
- "files": {
- "file1": "data:image/png;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgc3p8zdacMkc0Yyc0UAf/Z",
- "file2": "data:image/png;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgc3p8zdacMkc0Yyc0UAf/Z"
- },
- **************************
- "form": {},
- "headers": {
- "Accept": "*/*",
- "Accept-Encoding": "gzip, deflate",
- "Connection": "keep-alive",
- "Content-Length": "14054",
- **************************主要看这里
- "Content-Type": "multipart/form-data; boundary=ba662835a2364b069c99ba3ffa56b974",
- **************************
- "Host": "127.0.0.1:9999",
- "User-Agent": "python-requests/2.18.4"
- },
- "json": null,
- "origin": "127.0.0.1",
- "url": "http://127.0.0.1:9999/post"
- }
- """
示例4:上传时附带其它参数
如果我们需要在上传文件的同时传递一些其它参数,也是可以的:
- import requests
-
- data = {
- "name": "ABC.com",
- "age": 100
- }
- files = [
- ('file1', ('1.png', open('logo.png', 'rb'), 'image/png')),
- ('file2', ('2.png', open('logo.png', 'rb'), 'image/png'))
- ]
- response = requests.post('http://127.0.0.1:9999/post', data=data, files=files)
- print(response.text)
-
- """
- 接口返回结果:
- {
- "args": {},
- "data": "",
- **************************主要看这里
- "files": {
- "file1": "data:image/png;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDA0Yyc0UAf/Z",
- "file2": "data:image/png;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDA0Yyc0UAf/Z"
- },
- "form": {
- "age": "100",
- "name": "ABC.com"
- },
- **************************
- "headers": {
- "Accept": "*/*",
- "Accept-Encoding": "gzip, deflate",
- "Connection": "keep-alive",
- "Content-Length": "14233",
- **************************主要看这里
- "Content-Type": "multipart/form-data; boundary=6bdedbde2b48465683ef4e3451f7e015",
- **************************
- "Host": "127.0.0.1:9999",
- "User-Agent": "python-requests/2.18.4"
- },
- "json": null,
- "origin": "127.0.0.1",
- "url": "http://127.0.0.1:9999/post"
- }
- """
示例5:流式上传文件
- # cmd命令行终端执行如下命令。
- pip install requests-toolbelt
练习如下:
- """
- 1.学习目标
- 掌握requests发送post请求
- 2.HTTP协议中post请求参数类型
- x-www-form-data-urlencoded
- raw_json格式
- form-data
- binary
- 3.form-data格式
- # 1.导入requests库,requests_toolbelt库
- # 2.明确请求地址
- # 3.明确请求参数
- data = {} 字典格式
- 对请求参数加工(实例化)
- m = MultipartEncoder(fields = data)
- # 4.添加请求头
- headers = {"Content_Type":m.content_type}
- # 5.发送请求
- requests.post(url= url,data=m,headers=headers)
- 4.需求
- http://httpbin.org/post
- """
- # 1.导入requests库
- import requests
- from requests_toolbelt import MultipartEncoder
- # from requests_toolbelt.multipart.encoder import MultipartEncoder
-
- # 2.明确请求地址
- url = "http://httpbin.org/post"
- # 3.明确请求参数
- data = {
- "username": "Jerry",
- "password": "1232456",
- "sex": "男"
- }
-
- # requests-toolbelt 还提供了个监视器(MultipartEncoderMonitor),
- # 该监视器接受一个回调函数,我们可以在回调中实时跟踪进度。
- # from requests_toolbelt import MultipartEncoderMonitor
- # def my_callback(monitor):
- # progress = (monitor.bytes_read / monitor.len) * 100
- # print("\r 文件上传进度:%d%%(%d/%d)"
- # % (progress, monitor.bytes_read, monitor.len), end=" ")
-
- # m = MultipartEncoder(
- # fields={'name': 'ABC.com', "age": '100',
- # 'file1': ('1.png', open('logo.png', 'rb'), 'image/png'),
- # 'file2': ('2.png', open('logo.png', 'rb'), 'image/png')}
- # )
-
- # 4.添加请求头和加工请求参数
- # 加工请求参数----让每个参数都要带有边界
- m = MultipartEncoder(fields=data)
-
- # 添加请求头
- headers = {"Content_Type": m.content_type}
-
- # 4.发送请求
- response = requests.post(url=url, data=m, headers=headers)
- print(response.text)
-
- """
- 请求结果:
- {
- "args": {},
- "data": "",
- "files": {},
- **************************主要看这里
- "form": {
- "username": "Jerry",
- "password": "1232456",
- "sex": "男"
- },
- **************************
- "headers": {
- "Accept": "*/*",
- "Accept-Encoding": "gzip, deflate",
- "Content-Length": "192",
- **************************主要看这里
- "Content-Type": "multipart/form-data; boundary=351e0b73ea144694a9e9fdd1e10d2486",
- **************************
- "Host": "httpbin.org",
- "User-Agent": "python-requests/2.18.4",
- "X-Amzn-Trace-Id": "Root=1-5ff499ea-7ad42c4e6f056b44347b3c26"
- },
- "json": null,
- "origin": "106.35.9.12",
- "url": "http://httpbin.org/post"
- }
- """
主要区别在于:
最后:下面是配套学习资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!【100%无套路免费领取】
被百万人刷爆的软件测试题库!!!谁用谁知道!!!全网最全面试刷题小程序,手机就可以刷题,地铁上公交上,卷起来!
涵盖以下这些面试题板块:
1、软件测试基础理论 ,2、web,app,接口功能测试 ,3、网络 ,4、数据库 ,5、linux
6、web,app,接口自动化 ,7、性能测试 ,8、编程基础,9、hr面试题 ,10、开放性测试题,11、安全测试,12、计算机基础