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

requests.post触发421状态码失败,HTTPretty测试未通过

问题分析与解决

你的问题出在HTTPretty对421状态码的默认处理逻辑上。421(Misdirected Request)属于HTTP/2引入的特殊状态码,HTTPretty在默认配置下模拟这个状态码时,可能没有正确构建完整的HTTP响应(比如缺少必要的响应头),导致requests库认为连接被异常中断,直接抛出ConnectionError,根本没机会走到状态码判断的逻辑。

修复方案

方案1:添加完整的响应头

在httpretty.register_uri中显式指定headers参数,确保响应包含必要的HTTP头,让requests能正确解析响应:

@httpretty.activate
def test_http_status_code_421():
    httpretty.register_uri(
        method=httpretty.POST,
        uri="http://whatever.com",
        body="{}",
        status=421,
        headers={"Content-Type": "application/json"}  # 关键:补充响应头
    )

    with pytest.raises(MisRedirectedRequest):
        call_service({"123", "543"})

方案2:升级HTTPretty版本

部分旧版本的HTTPretty对HTTP/2新增的状态码支持不完善,升级到最新版本可能直接解决问题:

pip install --upgrade httpretty

方案3:手动构建响应(备选)

如果上述方案无效,可以尝试用httpretty.Response手动构建完整响应:

@httpretty.activate
def test_http_status_code_421():
    def custom_response(request, uri, headers):
        return httpretty.Response(
            body="{}",
            status=421,
            headers={"Content-Type": "application/json"}
        )

    httpretty.register_uri(
        method=httpretty.POST,
        uri="http://whatever.com",
        body=custom_response
    )

    with pytest.raises(MisRedirectedRequest):
        call_service({"123", "543"})

验证逻辑

添加响应头后,requests能正确接收并解析421状态码,进而执行你的异常抛出逻辑,测试就能正常通过了。其他状态码(如420、500)因为是HTTP/1.1标准定义的,HTTPretty默认处理逻辑没问题,所以测试正常。

内容的提问来源于stack exchange,提问作者Luís Soares

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 03:20:26