Python 请求重定向到 GET 而不是 POST

问题描述 投票:0回答:2

我正在尝试调用 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 请求?

python http python-requests
2个回答
0
投票

状态 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 表示原始方法。


0
投票

在这里查看我的答案https://stackoverflow.com/a/78845896/364818

简单地说,

requests
被故意破坏,在重定向后将 POST 转换为 GET,以模仿浏览器被破坏的方式...

© www.soinside.com 2019 - 2024. All rights reserved.