FastAPI实现webhook时调用Request.json无法获取正确JSON数据问题
问题原因
- FastAPI 中
Request对象的json是异步协程方法,不是属性,你代码中print(request.json)没有加括号调用方法,直接打印的是方法本身的内存地址,也就是你看到的<function Request.json at 0x...>输出 - 该方法是异步方法,调用后需要搭配
await关键字等待执行完成,才能拿到解析后的JSON数据 - 你代码中
return await request.json()写法是正确的,接口实际响应会返回你需要的JSON结构,仅控制台打印逻辑有问题
修正后的代码
main.py
from fastapi import FastAPI, Request app = FastAPI() @app.post("/webhook") async def get_body(request: Request): # 先调用异步方法获取解析后的JSON数据再打印 json_data = await request.json() print(json_data) return json_data
可选优化写法
如果不需要额外操作原始请求对象,FastAPI支持自动解析JSON请求体,无需手动调用request.json():
from fastapi import FastAPI from pydantic import BaseModel, Field app = FastAPI() # 定义接收的JSON结构,带空格的字段用alias指定映射 class WebhookPayload(BaseModel): name: str channel_url: str = Field(alias="Channel URL") @app.post("/webhook") async def get_body(payload: WebhookPayload): # by_alias=True 保证输出时保留原字段名"Channel URL" print(payload.dict(by_alias=True)) return payload.dict(by_alias=True)
这种写法还会自动对请求数据做类型校验,不符合结构的请求会直接返回422错误,无需手动处理异常。
内容的提问来源于stack exchange,提问作者dtc348
相关产品推荐
相关产品推荐

