为何客户端收到的status_code与接口返回的不一致?
问题原因分析
你遇到的情况和你的猜测完全一致:
response.json()仅将上游API返回的响应体解析为Python字典/列表对象,并不会保留原响应的状态码、响应头等元数据。- 当你在FastAPI路由函数中返回这个Python对象时,框架会自动创建一个全新的Response对象,默认使用
200 OK作为状态码,仅把你返回的对象序列化为JSON作为响应体。这就是为什么哪怕上游API返回错误状态码(比如400、500),客户端收到的状态码还是200的核心原因。
解决方案
根据你的需求,有两种常用处理方式:
1. 完全透传上游API的响应(状态码、响应头、响应体全保留)
如果想原封不动地把上游API的响应返回给客户端,可以直接使用FastAPI的Response类,手动传入上游响应的所有信息:
from fastapi import Response import requests @router.post("/my_endpoint") async def my_method(): # 调用上游API response = requests.post(url="<url_to_the_other_api>", headers=headers, timeout=10) # 透传完整响应 return Response( content=response.content, # 直接使用上游原始响应体,避免二次解析 status_code=response.status_code, # 复用上游的状态码 headers=dict(response.headers), # 复用上游响应头(转为字典适配FastAPI) media_type=response.headers.get("Content-Type", "application/json") # 指定响应媒体类型 )
2. 返回解析后的JSON,但同步上游状态码
如果仍想返回解析后的JSON对象,但需要保留上游的状态码,可以使用JSONResponse类显式指定状态码:
from fastapi import JSONResponse import requests @router.post("/my_endpoint") async def my_method(): response = requests.post(url="<url_to_the_other_api>", headers=headers, timeout=10) return JSONResponse( content=response.json(), # 解析后的JSON数据 status_code=response.status_code # 同步上游的状态码 )
关键注意点
FastAPI路由函数返回普通Python可序列化对象(字典、列表等)时,框架默认生成200 OK响应。只有当你显式返回Response(或其子类如JSONResponse)对象时,才能自定义状态码、响应头等参数。
内容的提问来源于stack exchange,提问作者AlexPauloDev
相关产品推荐
相关产品推荐

