python requests库中的post详解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python requests库中的post详解相关的知识,希望对你有一定的参考价值。

参考技术A 一、post请求及响应详解

返回结果:

大家看,其实通过post发送请求很简单

下面再讲讲返回信息的具体内容

大家看,其实有很多的返回值参数,其实我们实际中能用到的并不多,我下边一一列举出来了

response.json():返回信息的格式是json,应为我们请求的时候是json格式,返回的也是一个json,如果返回报错,应该是开发的接口出错了

response.text:如果response.json,可以使用text调试一下,看看具体的返回内容是什么,这里看到的都是字符串了

response.status_code:返回的http状态码,200是成功,404是未找到接口路径,500是服务器错误,等等

response.url:返回请求时的url地址

response.headers:返回服务器给你的响应header

response.cookies:返回服务器给你的cookies,这是一个多么好的获取cookie的方法啊,

response.content:同response.text是一样的

二、post请求中的其他参数

复制

import requests

res = requests.post(url="url",data="body",timeout=30,verfiy=False)

print(res.json())

url:请求的全路径地址,一定是要完整的路径哦

data:请求的内容,如果是json的格式,最好使用json.dumps,反序列化一下,避免格式错误,如果是其他格式,就都是字符串了

timeout:设置超时时间,这样我们在自动化测试和爬虫的时候,当达到了设置的超时时间,我们的程序就退出不会一直等待了,可以做其他操作了

verfiy:如果请求的接口是https协议,这个参数就很好用了,如果设置该参数为True,那么我们的脚本就是要配置CA证书,建议参数值为False,好用又简单

好了,post的请求详解就这些了,欢迎大家点赞留言,我会给大家解答疑问的

Python post 请求在请求库中引发 400 'Bad Request' 错误,但适用于 cURL

【中文标题】Python post 请求在请求库中引发 400 \'Bad Request\' 错误,但适用于 cURL【英文标题】:Python post request throwing 400 'Bad Request' error with requests library but works with cURLPython post 请求在请求库中引发 400 'Bad Request' 错误,但适用于 cURL 【发布时间】:2021-12-02 06:22:00 【问题描述】:

我有一个脚本调用 POST 端点但收到 400 错误。同时对应的cURL请求成功。

首先,这里是 cURL:

curl -X 'POST' \
  'http://localhost:8080/api/predict?Key=123testkey' \
  -H 'accept: application/json' \
  -H 'Content-Type: multipart/form-data' \
  -F 'file=@156ac81cde4b3f22faa4055b53867f38.jpg;type=image/jpeg'

并翻译为请求:

import requests

url = 'http://localhost:8080/api/predict?Key=123testkey'

headers = 
    'accept': 'application/json',
    'Content-Type': 'multipart/form-data',


params = 'Key' : '123testkey'

files = 'image': open('156ac81cde4b3f22faa4055b53867f38.jpg', 'rb')

response = requests.post(url, files=files, params=params, headers=headers)

也尝试使用不包含密钥的 URL,因为密钥已在参数中指定:

import requests

url = 'http://localhost:8080/api/predict'

headers = 
    'accept': 'application/json',
    'Content-Type': 'multipart/form-data',


params = 'Key' : '123testkey'

files = 'image': open('156ac81cde4b3f22faa4055b53867f38.jpg', 'rb')

response = requests.post(url, files=files, params=params, headers=headers)

我认为这应该很简单,但无论我尝试什么,我都会收到 400 错误的请求。有什么建议吗?

编辑:也尝试了 'image/jpeg' 而不是 'image' 无济于事。

编辑:不幸的是,用“文件”替换“图像”键也不起作用

编辑:它在邮递员桌面上工作得很好,并生成以下代码。但是,此代码也会引发错误。

邮递员生成的代码:

import requests

url = "http://localhost:8080/api/predict?Key=123test"

payload=
files=[
  ('file',('images19.jpg',open('156ac81cde4b3f22faa4055b53867f38.jpg','rb'),'image/jpeg'))
]
headers = 
  'Accept': 'application/json',
  'Content-Type': 'multipart/form-data'


response = requests.request("POST", url, headers=headers, data=payload, files=files)

print(response.text)

还有来自邮递员之前生成的代码的错误:

"detail":"There was an error parsing the body"

任何帮助弄清楚发生了什么将不胜感激!

【问题讨论】:

files 中,键“image”的值是文件描述符,而不是数据。您需要读取和编码(可能是 Base64)该数据。 尝试使用邮递员 - ***.com/questions/39037049/…。一旦它在那里工作 - 让邮递员为你生成 python 代码。 感谢您的建议,我让它在邮递员中正常工作,但生成的代码抛出以下错误:“detail”:“解析正文时出错”。 【参考方案1】:

您的问题在于您需要使用键“file”而不是“image”添加的变量文件,这是您的 curl 和您的 python 代码之间的区别,还删除了标头,因为当您传递文件参数时,请求集发送文件的正确标题。例如:

import requests

url = 'http://localhost:8080/api/predict?Key=123testkey'

params = 'Key' : '123testkey'

files = 'file': open('156ac81cde4b3f22faa4055b53867f38.jpg', 'rb')

response = requests.post(url, files=files, params=params)

【讨论】:

啊,感谢您指出这一点,这是有道理的...我将密钥更改为“文件”,但奇怪的是仍然收到 400 错误 我认为在标题中也是“接受”,大写“A” 但我认为你不需要传递 header 参数,因为当你传递它检测到的文件是多部分内容类型 哇,一旦我删除了标题,它就可以工作了!好建议,谢谢 很高兴听到,最好的。我用那个改变编辑了答案。

以上是关于python requests库中的post详解的主要内容,如果未能解决你的问题,请参考以下文章

Python爬虫入门-2.Requests库中Post的使用方法有哪些?

Python post 请求在请求库中引发 400 'Bad Request' 错误,但适用于 cURL

requests库详解

python3+requests:post请求四种传送正文方式(详解)

python中request的get和post请求方法详解

python3网络爬虫学习——使用requests