我正在尝试调用 REST API 的 url,该 API 可以进行 GET 和 POST 请求。我想发送 POST 请求。如果我通过 ThunderClient 插件运行我的请求,一切都会正常。我可以发送 POST 请求并获取正确的数据。
如果我像这样用 python 发送请求:
import requests
response = requests.post(
url,
data=payload,
verify=certificate,
)
pprint(response.request)
它将打印
<PreparedRequest [GET]>
。 requests 库重定向以发送 GET,我将得到相应的 GET 响应。
如果我设置
allow_redirects=False
:
import requests
response = requests.post(
url,
data=payload,
allow_redirects=False,
verify=certificate,
)
pprint(response.request)
它将打印
<PreparedRequest [POST]>
,但我得到一个空的 response.text
和这个标题:
{'Cache-Control': 'no-cache', 'Content-length': '0', 'Location': '...url...', 'Connection': 'close'}
和状态代码 302。
我通过ThunderClient发送POST请求时没有这个问题。我刚刚得到预期的数据。
我在这里做错了什么?如何确保我发送 POST 请求?
状态 302 的确切行为是由实现定义的。
302 找到(之前“暂时移动”) 告诉客户端查看(浏览)另一个 URL。 HTTP/1.0 规范 (RFC 1945) 要求客户端执行临时 用同样的方法重定向(原来的描述短语是 “暂时移动”),[11]但流行的浏览器实现了 302 通过将方法更改为 GET 来重定向。因此,HTTP/1.1添加了 状态码 303 和 307 来区分两者 行为。[10]
https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#3xx_redirection
某些实现可能使用 GET 重定向,而其他实现则使用 POST(原始方法)重定向。使用状态 303 表示 GET,使用状态 307 表示原始方法。
在这里查看我的答案https://stackoverflow.com/a/78845896/364818
简单地说,
requests
被故意破坏,在重定向后将 POST 转换为 GET,以模仿浏览器被破坏的方式...