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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 16:29:50