python+requests——发送post请求——各种情况

Posted 小白龙白龙马

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python+requests——发送post请求——各种情况相关的知识,希望对你有一定的参考价值。


requests库是 python3 中非常优秀的第三方库,它使用 Apache2 Licensed 许可证的 HTTP 库,用 Python 编写,真正的为人类着想。

requests 使用的是 urllib3(python3.x中的urllib),因此继承了它的所有特性。

Requests 会自动实现持久连接keep-alive,Requests 支持 HTTP 连接保持和连接池,支持使用 cookie 保持会话,支持文件上传,

支持自动确定响应内容的编码,支持国际化的 URL 和 POST 数据自动编码,现代、国际化、人性化。

Requests库中有7个主要的函数,分别是 request() 、get() 、 head() 、post() 、put() 、patch() 、delete() 。

这七个函数中request()函数是其余六个函数的基础函数,其余六个函数的实现都是通过调用该函数实现的。


 

 


 

 

 

 

 

 


 

 

json和dict
python中的dict类型要转换为json格式的数据需要用到json库:

import json
 
<json> = json.dumps(<dict>)
<dict> = json.loads(<json>)
需要注意的是python中并没有json类型这一说法,通过json.dumps(<dict>)转换的字典对象,最后得到的是一个字符串对象,

 

也就是说,在python中json格式的数据实际上就是一个字符串

>>> j = json.dumps(<dict>)
>>> type(j)
<class \'str\'>
虽说json格式的数据在python中是以字符串的类型存在的,但是通过str(<dict>)工厂函数所得到的结果同json.dumps(<dict>)方法所得到的结果是不相同的


以看出来stringjs的区别在于引号。对于可以作为json.loads(<str>)参数对象的字符串,除了要满足字典类型的格式外,所有的字符串对象必须是双引号。


Python Requests post 方法中 data 与 json 参数问题

1.data参数

你想要发送一些编码为表单形式的数据——非常像一个 HTML 表单。要实现这个,只需简单地传递一个字典给 data 参数。你的数据字典在发出请求时会自动编码为表单形式,header默认Content-Type: application/x-www-form-urlencoded,

发送过来的抓包到的数据格式为:\'username=amy&password=123\'

如果你传递一个 string 而不是一个 dict,那么数据会被直接发布出去,不会被编码为表单形式

例如传\'{"username": "amy", "password": "123"}\',直接发出去,抓包的内容也是\'{"username": "amy", "password": "123"}\'

2.json参数

还可以使用 json 参数直接传递,然后它就会被自动编码,header默认\'Content-Type\': \'application/json\'

json发送过来的数据格式为:{"username": "amy", "password": "123"}

3.实际场景中如何使用

1)对页面接口抓包,如果Content-Type:application/json,则限制接受json格式,requests中可用json方法,

或者使用data方法,headers加\'Content-Type\': \'application/json\',postdata传string格式,不会自动编码格式

2)对页面接口抓包,Content-Type:application/x-www-form-urlencoded; charset=UTF-8,则可使用data方法

 

===================================================================================================

 

 

 

 

 

 


===============================================================================================================

带参数的get请求:

参数在网页url后面:"url": "http://httpbin.org/get?key1=value1&key2=value2"

import requests

payload = {\'key1\': \'value1\', \'key2\': \'value2\'}

r = requests.get("http://httpbin.org/get", payload=payload )

print(r.text)

执行结果:

{
"args": {
"key1": "value1",
"key2": "value2"
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.23.0",
"X-Amzn-Trace-Id": "Root=1-5e501d6f-72b6f98a2655a02975b0fc47"
},
"origin": "122.194.13.251",
"url": "http://httpbin.org/get?key1=value1&key2=value2"
}


====================================================================================================









import requests




print(\'#------------------------------------------------------------------------------------------1\')



#发送不带参数、不带响应体的post请求:



r = requests.post(\'http://httpbin.org/post\')








print(\'#------------------------------------------------------------------------------------------2\')


#发送带请求体参数的post请求,key:value:默认类型为即:content-type为application/x-www-form-urlencoded




# x-www-form-urlencoded

# 当action为get时候,浏览器用x-www-form-urlencoded的编码方式把form数据转换成一个字串(name1=value1&name2=value2…)
# ,
# 然后把这个字串append到url后面,用?分割,加载这个新的url。


#pplication/x-www-form-urlencoded : <form encType=””>中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)



payload = ((\'key1\', \'value1\'), (\'key1\', \'value2\'))

r = requests.post(\'http://httpbin.org/post\', date=payload)




print(\'#------------------------------------------------------------------------------------------3\')


#发送带响应体的post请求,json文件

#multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式

#如果提交表达,即需要设置content-type 即 设置 header


下面:发送content-type为json格式的请求体

import requests
import json

payload = ((\'key1\', \'value1\'), (\'key1\', \'value2\'))

header = { \'content-type\':\'application/json\'}

r = requests.post(\'http://httpbin.org/post\', json.dumps(payload),headers=header) #注意:将payload参数转化为字典类型


--------------------------------------------------------------------------------------------------------------

方法二:


import requests
import json

payload = ((\'key1\', \'value1\'), (\'key1\', \'value2\'))

r = requests.post(\'http://httpbin.org/post\', json(payload)) #注意:将payload参数转化为字典类型

===============================================================================================================

multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式

即大型文件:比如excel、视频文件等
import requests

x = {\'file\':open(\'C:\\\\Users\\\\del\\\\Desktop\\\\新建文本文档 (3).txt\',\'rb\')}

r = requests.post(\'http://httpbin.org/post\', files = x)

print(r.text)


-------------------------------------------------------------------------------------

当然,也可以指定这个文件的一些描述信息,详细的如下:


POST一个多部分编码(Multipart-Encoded)的文件

Requests 使得上传多部分编码文件变得很简单:

>>> url = \'http://httpbin.org/post\'

>>> file = {\'file\': open(\'report.xls\', \'rb\')}

>>> r = requests.post(url, files=file)

>>> r.text


{
...
"files": {
"file": "<censored...binary...data>"
},
...
}

 

 


你可以显式地设置文件名,文件类型和请求头:

url = \'http://httpbin.org/post\'


files = {\'file\': (\'report.xls\', open(\'report.xls\', \'rb\'), \'application/vnd.ms-excel\', {\'Expires\': \'0\'})}

 

r = requests.post(url, files=files)

 

 r.text
{
...
"files": {
"file": "<censored...binary...data>"
},
...
}
如果你想,你也可以发送作为文件来接收的字符串:

>>> url = \'http://httpbin.org/post\'
>>> files = {\'file\': (\'report.csv\', \'some,data,to,send\\nanother,row,to,send\\n\')}

>>> r = requests.post(url, files=files)
>>> r.text
{
...
"files": {
"file": "some,data,to,send\\\\nanother,row,to,send\\\\n"
},
...
}
如果你发送一个非常大的文件作为 multipart/form-data 请求,你可能希望将请求做成数据流。

默认下 requests 不支持, 但有个第三方包 requests-toolbelt 是支持的。你可以阅读 toolbelt 文档 来了解使用方法。














=============================================================================================================
Accept-Encoding:跟压缩有关,浏览器发送http请求给web服务器,http请求中的header有Accept-Encoding:gzip,deflate(告诉服务器,浏览器支持gzip压缩)



Content-Length:发送给HTTP服务器数据的长度。

 


Content-Type:即是Internet Media Type,互联网媒体类型;也叫做MIME类型,在Http协议消息头中,使用Content-Type来表示具体请求中的媒体类型信息。

              例如:Content-Type: application/x-www-form-urlencoded

常见的媒体格式类型如下:

text/html : HTML格式

text/plain :纯文本格式 

text/xml : XML格式

image/gif :gif图片格式 

image/jpeg :jpg图片格式

image/png:png图片格式

以application开头的媒体格式类型:

application/xhtml+xml :XHTML格式

application/xml : XML数据格式

application/atom+xml :Atom XML聚合格式 

application/json : JSON数据格式

application/pdf :pdf格式

application/msword : Word文档格式

application/octet-stream : 二进制流数据(如常见的文件下载)

application/x-www-form-urlencoded : <form encType=””>中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)

另外一种常见的媒体格式是上传文件之时使用的:

multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式

注意:gzip、compress以及deflate编码都是无损压缩算法,用于减少文件传输大小,不会导致信息丢失,其中gzip效率最高,使用最广。

以上是关于python+requests——发送post请求——各种情况的主要内容,如果未能解决你的问题,请参考以下文章

大概看了一天python request源码。写下python requests库发送 get,post请求大概过程。

python之使用request模块发送post和get请求

python+requests接口自动化2. 发送get请求与post请求(包含json格式的请求)

python+requests接口自动化2. 发送get请求与post请求(包含json格式的请求)

Python接口测试,requests库的post请求进行文件上传

python+pytest接口自动化框架-requests发送post请求