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

如何在FastAPI中获取并打印完整的请求体?

FastAPI中间件获取完整请求体的解决方案

你当前的中间件遍历request对象只能拿到URL中的查询/路径参数(比如例子里的user_id),而EditService对应的是请求体(JSON),这类参数不会被遍历到,必须主动读取请求体内容。

基础实现:读取并打印原始请求体

from fastapi import Request, FastAPI

@app.middleware("http")
async def print_full_request(request: Request, call_next):
    # 读取原始请求体字节流
    raw_body = await request.body()
    print("原始请求体:", raw_body.decode("utf-8"))
    
    # 重置请求体,避免后续路由无法解析
    request._body = raw_body
    
    # 同时打印查询参数和路径参数
    print("查询参数:", dict(request.query_params))
    print("路径参数:", dict(request.path_params))
    
    response = await call_next(request)
    return response

进阶实现:解析请求体为字典

如果需要直接拿到结构化的请求体数据,可以解析为JSON字典:

@app.middleware("http")
async def print_full_request(request: Request, call_next):
    body_data = {}
    try:
        # 尝试解析为JSON
        body_data = await request.json()
        print("解析后的请求体:", body_data)
        # 重置请求体(json()已读取过流,需重新赋值)
        raw_body = await request.body()
        request._body = raw_body
    except Exception:
        # 处理非JSON格式请求(如表单、二进制数据)
        raw_body = await request.body()
        print("非JSON请求体:", raw_body.decode("utf-8"))
        request._body = raw_body
    
    print("查询参数:", dict(request.query_params))
    print("路径参数:", dict(request.path_params))
    
    response = await call_next(request)
    return response

关键说明

  • 请求体是一次性读取的字节流,中间件读取后必须通过request._body = raw_body重置,否则后续路由函数无法解析请求体(比如你的EditService模型会无法绑定数据)。
  • 如果接口接收的是表单数据,可替换为await request.form(),同样需要重置请求体。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 11:05:07