FastAPI中如何获取POST请求体并转换后转发至其他服务器?
FastAPI中如何获取POST请求体并转换后转发至其他服务器?
兄弟,我懂你习惯了Express里req.body那种直接拿请求体的方式,刚用FastAPI的时候确实会有点懵,其实FastAPI用Pydantic模型来处理请求体反而更省心,还自带校验功能,我给你一步步理清楚:
一、先把你现有代码的问题修正
你已经找对了用Pydantic BaseModel解析请求体的方向,但代码里有两个小问题:一是title = body这行错了,body是你定义的Body类的实例,要拿里面的标题得用body.title;二是posts变量没初始化,得先在函数外面定义成空字典。修正后的基础版本如下:
import json from random import random from fastapi import FastAPI from pydantic import BaseModel app = FastAPI() posts = {} # 初始化存储用的空字典 class Body(BaseModel): title: str @app.post("/posts/") async def posts(body: Body): number = random() # 正确获取请求体里的title字段 title = body.title posts[number] = { "msgtype": "PostCreated", "data": { "id": number, "title": title, } } return posts[number]
二、如何把转换后的请求体转发到其他服务器
FastAPI是异步框架,咱们用异步HTTP客户端aiohttp来转发最适配,先通过pip install aiohttp安装它,然后修改代码加上转发逻辑:
import json from random import random from fastapi import FastAPI from pydantic import BaseModel import aiohttp app = FastAPI() posts = {} class Body(BaseModel): title: str @app.post("/posts/") async def posts(body: Body): number = random() title = body.title # 构造要转发的新请求体结构 new_body = { "msgtype": "PostCreated", "data": { "id": number, "title": title, } } posts[number] = new_body # 转发到目标服务器,把下面的地址换成你实际要对接的服务器地址 target_url = "http://your-target-server/api/forward" async with aiohttp.ClientSession() as session: async with session.post(target_url, json=new_body) as resp: # 可以根据需求处理目标服务器的响应,比如打印状态码 print(f"转发请求状态码: {resp.status}") # 如果需要获取响应内容,可使用 await resp.json() return new_body
三、聊聊为什么FastAPI要用Pydantic模型
可能你会疑惑为啥不能像Express那样直接拿请求体,其实这是FastAPI的优势:
- 自动校验请求体:如果客户端发的请求体缺少
title字段,或者title不是字符串,FastAPI会自动返回422错误,不用你手动写校验逻辑 - 类型提示友好:编辑器会自动补全模型的属性,减少拼写错误
- 自动生成接口文档:访问
/docs就能看到自动生成的Swagger文档,测试起来超方便
当然,要是你真的需要直接拿原始的JSON请求体(跳过Pydantic解析),也可以这么做:
from fastapi import Request @app.post("/raw-body/") async def raw_body(request: Request): # 直接获取原始请求体并解析为JSON raw_json = await request.json() title = raw_json.get("title") # 后续处理逻辑...
不过这种方式就失去了Pydantic的自动校验和类型提示,除非有特殊需求,不然还是用模型更靠谱。
备注:内容来源于stack exchange,提问作者EagleStar
相关产品推荐
相关产品推荐

