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 requestsimport 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 requestsimport 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效率最高,使用最广。

原文地址:https://www.cnblogs.com/xiaobaibailongma/p/12343973.html

时间: 2024-10-05 10:59:16

python+requests——发送post请求——各种情况的相关文章

requests发送post请求的一些疑点

前言 在Python爬虫中,使用requests发送请求,访问指定网站,是常见的做法.一般是发送GET请求或者POST请求,对于GET请求没有什么好说的,而发送POST请求,有很多朋友不是很清楚,主要是因为容易混淆POST提交的方式.今天在微信交流群里,就有朋友遇到了这种问题,特地讲解一下. 在HTTP协议中,post提交的数据必须放在消息主体中,但是协议中并没有规定必须使用什么编码方式,从而导致了提交方式的不同.服务端根据请求头中的Content-Type字段来获知请求中的消息主体是用何种方式

python+requests——发送带参数的get请求

Requests 允许你使用 params 关键字参数,以一个字符串字典来提供这些参数. 举例来说,如果你想传递 key1=value1 和 key2=value2 到 httpbin.org/get ,那么你可以使用如下代码: payload = {'key1': 'value1', 'key2': 'value2'} resp = requests.get("http://httpbin.org/get", params=payload,timeout=0.5) 原文地址:http

【python】发送post请求

1. json格式的post请求 关键部分加粗显示了,主要是post数据的编码方式以及请求头的Content-type #coding=utf8 import json import gzip import msgpack import urllib import urllib2 import tarfile def request(): try: url = "http://10.11.12.13/abc/def" values = {"a":1, "b

使用Requests发送Http请求

安装Requests第三方库: 在命令行输入pip install requests 官方中文版文档地址: http://cn.python-requests.org/zh_CN/latest/user/quickstart.html#id2

python requests方法post请求json格式处理

方法如下: import requestsimport json data = {    'a': 123,    'b': 456} ## headers中添加上content-type这个参数,指定为json格式headers = {'Content-Type': 'application/json'} ## post的时候,将data字典形式的参数用json包转换成json格式.response = requests.post(url='url', headers=headers, dat

python非转基因HTTP请求库--Requests: 让 HTTP 服务人类

快速上手 迫不及待了吗?本页内容为如何入门 Requests 提供了很好的指引.其假设你已经安装了 Requests.如果还没有,去安装一节看看吧. 首先,确认一下: Requests 已安装 Requests 是最新的 让我们从一些简单的示例开始吧. 发送请求 使用 Requests 发送网络请求非常简单. 一开始要导入 Requests 模块: >>> import requests 然后,尝试获取某个网页.本例子中,我们来获取 Github 的公共时间线: >>>

python接口自动化(六)--发送get请求接口(详解)

简介 如果想用python做接口测试,我们首先有不得不了解和学习的模块.它就是第三方模块:Requests. 虽然Python内置的urllib模块,用于访问网络资源.但是,它用起来比较麻烦,而且,缺少很多实用的高级功能.更好的方案是使用 requests.它是一个Python第三方库,处理URL资源特别方便.查看其中文官网:http://cn.python-requests.org/zh_CN/latest/index.html 英文官网:http://www.python-requests.

[转] Python requests 查看发送的完整request

有时候在使用Python requests发送请求时需要检查完整的request数据,但是requests库没有直接提供返回完整的request数据的属性.如下是解决方案(通过日志获取):https://stackoverflow.com/questions/10588644/how-can-i-see-the-entire-http-request-thats-being-sent-by-my-python-application 原文地址:https://www.cnblogs.com/r0

python发送网络请求

1.使用urllib模块 get请求: res = urlopen(url) from urllib.request import urlopen url = 'http://www.nnzhp.cn' print(urlopen(url))#返回http.client.HTTPResponse object at 0x00000235BA25A160 print(urlopen(url).read().decode())#返回get到的页面的源代码 # decode是将base类型转为enco