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

FastAPI POST接口pytest测试返回307而非200问题排查

FastAPI测试返回307状态码的原因及解决办法

问题根源

  • 路由斜杠不匹配
    你定义的接口路由是/confidence/(带末尾斜杠),但测试代码里调用的是/confidence(不带斜杠)。FastAPI默认会对缺少末尾斜杠的请求返回307临时重定向,引导到带斜杠的正确路由。浏览器和curl会自动跟随重定向,所以实际调用时你看不到307;但TestClient默认不自动处理重定向,直接返回了原始的307状态码。

  • 请求数据格式错误
    测试里用json=json.dumps(data)是多余的——TestClient的json参数接受Python字典,会自动帮你序列化为JSON字符串。你传序列化后的字符串,后端会收到一个JSON格式的字符串而非预期的JSON对象,后续可能解析失败(这不是当前307的直接原因,但必须修正)。

修复步骤

1. 修正请求路径

把测试里的请求路径改成带末尾斜杠的版本:

response = client.post("/confidence/", json=data)

如果想让接口同时兼容带/不带斜杠的路径,可以在初始化FastAPI时设置redirect_slashes=False,但不建议这么做,不符合RESTful路由规范。

2. 修正请求数据传递

直接把Python字典传给json参数,不需要手动调用json.dumps:

response = client.post("/confidence/", json=data)

完整修正后的测试代码

from fastapi.testclient import TestClient
from src.main import app

client = TestClient(app)

def test_get_confidence_ws():
    data = {
        "acc_id": 1234567801,
        "remoteIp": "127.255.255.255",
        "userAgent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:104.0) Gecko/20100101 Firefox/104.0"
    }
    response = client.post("/confidence/", json=data)
    assert response.status_code == 200

额外说明

307是临时重定向状态码,FastAPI的这个行为是为了保证路由一致性。浏览器自动处理重定向,所以你看到的是最终200响应;TestClient作为测试工具,默认返回原始状态码,方便你排查路由匹配问题。

内容的提问来源于stack exchange,提问作者s510

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 05:05:24