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
相关产品推荐
相关产品推荐

