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

为何客户端收到的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 04:37:14