python requests post请求_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()函数是其余六个函数的基础函数,其余六个函数的实现都是通过调用该函数实现的。

python requests post请求_python+requests——发送post请求——各种情况_第1张图片

python requests post请求_python+requests——发送post请求——各种情况_第2张图片

python requests post请求_python+requests——发送post请求——各种情况_第3张图片

python requests post请求_python+requests——发送post请求——各种情况_第4张图片

python requests post请求_python+requests——发送post请求——各种情况_第5张图片

python requests post请求_python+requests——发送post请求——各种情况_第6张图片

json和dict

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

import json

= json.dumps()

= json.loads()

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

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

>>> j = json.dumps()

>>> type(j)

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

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

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方法

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

python requests post请求_python+requests——发送post请求——各种情况_第7张图片

python requests post请求_python+requests——发送post请求——各种情况_第8张图片

python requests post请求_python+requests——发送post请求——各种情况_第9张图片

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

带参数的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 :

中默认的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": ""

},

...

}

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

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": ""

},

...

}

如果你想,你也可以发送作为文件来接收的字符串:

>>> 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 :

中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)

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

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

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

你可能感兴趣的:(python,requests,post请求)