You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tornado中发送POST请求却被Worker识别为GET请求的问题求助

Tornado中发送POST请求却被Worker识别为GET请求的问题求助

嘿,我来帮你看看这个问题!这种明明发了POST却被当成GET的情况确实挺让人头疼的,结合你给出的代码和描述,我大概想到几个可能的原因,咱们一步步排查:

最可能的原因:重定向导致请求方法被自动转换

Tornado的AsyncHTTPClient.fetch()默认会自动跟随重定向(比如301/302响应),而根据HTTP标准,当POST请求遇到这类重定向时,会被强制转换成GET请求,同时原请求体也会丢失——这完全符合你描述的“空体GET请求进入Worker的GET方法”的情况!

举个常见的场景:如果你的endpoint_url是http://worker/handler(末尾无斜杠),但Worker端的路由实际配置的是http://worker/handler/(末尾带斜杠),Tornado会自动返回301重定向到带斜杠的地址,这时候你的POST请求就会被转换成GET。

验证&解决方法:

在创建HTTPRequest时加上follow_redirects=False参数,禁用自动重定向:

request = tornado.httpclient.HTTPRequest(
    url=endpoint_url,
    method="POST",
    body=preprocessed_request,
    connect_timeout=1800.00,
    request_timeout=1800.00,
    follow_redirects=False  # 关键:禁用自动跟随重定向
)

如果此时你收到了3xx的响应,就坐实了重定向的问题,接下来只需要修正endpoint_url,让它和Worker端的路由完全匹配(包括末尾的斜杠)即可。

额外排查点:Worker端的路由与日志

  1. 确认Worker路由配置:再检查一遍Worker的POST方法是否绑定了正确的路由路径,有没有拼写错误或者路径不匹配的情况——如果Tornado找不到对应路径的POST处理器,会不会有默认逻辑fallback到GET方法?
  2. 添加详细日志:在Worker的GET和POST方法里都加上日志,打印请求的完整信息,这样能直观看到请求的真实状态:
    async def get(self):
        print(f"收到GET请求: 方法={self.request.method}, URI={self.request.uri}, 头部={self.request.headers}")
        # 原有代码
    
    async def post(self):
        print(f"收到POST请求: 方法={self.request.method}, URI={self.request.uri}, 请求体={self.request.body}")
        # 原有代码
    

小概率排查:预处理环节的误操作

虽然从你给出的代码看可能性很低,但也可以快速排除一下:preprocessed_request的生成过程中,有没有不小心修改过请求方法相关的参数?比如会不会在预处理时把请求方法覆盖成GET了?

备注:内容来源于stack exchange,提问作者Irina Kärkkänen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 09:53:00