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

