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

FastAPI如何处理含换行符的POST请求参数?

解决FastAPI中带换行符参数的JSON解码与API文档显示问题

一、修复BaseModel接收带换行符参数的JSON解码错误

JSON规范要求字符串内的换行符需转义为\n,若客户端直接传入未转义的换行符(如\n或\r\n),默认解析器会抛出无效控制字符错误。以下两种方案可解决:

1. 全局配置自定义JSON解码器

修改FastAPI应用的JSON解析规则,允许解析包含未转义控制字符的JSON:

from fastapi import FastAPI
from pydantic import BaseModel
import json

class QA(BaseModel):
    question: str
    answer: str

def custom_json_decoder(content: bytes):
    return json.loads(content.decode("utf-8"), strict=False)

app = FastAPI()
app.json_decoder = custom_json_decoder

@app.post("/submit-qa")
async def submit_qa(qa: QA):
    return {"question": qa.question, "answer": qa.answer}

strict=False参数会让JSON解析器忽略控制字符的语法错误,正常解析包含原生换行符的字符串。

2. Pydantic字段级处理

若无需全局修改,可在BaseModel中添加字段验证逻辑,统一换行符格式(仅适用于客户端已正确传递转义换行符的场景):

from pydantic import BaseModel, field_validator

class QA(BaseModel):
    question: str
    answer: str

    @field_validator("question", "answer")
    def normalize_newlines(cls, value):
        return value.replace("\r\n", "\n")

二、使用Request接收请求体同时保留API文档参数显示

直接使用Request对象接收请求体时,FastAPI无法自动生成参数文档,可通过以下方式兼顾:

1. 结合BaseModel与Depends手动解析

通过Depends封装请求体解析逻辑,同时借助BaseModel提供文档结构:

from fastapi import FastAPI, Depends, Request
from pydantic import BaseModel
import json

class QA(BaseModel):
    question: str
    answer: str

app = FastAPI()

async def parse_qa_request(request: Request):
    body_content = await request.body()
    qa_data = json.loads(body_content.decode("utf-8"), strict=False)
    return QA(**qa_data)

@app.post("/submit-qa")
async def submit_qa(qa: QA = Depends(parse_qa_request)):
    return {"question": qa.question, "answer": qa.answer}

此方式下,API文档会自动展示QA类的参数结构,同时我们可在解析函数中处理带换行符的JSON。

2. 用Body参数接收纯文本JSON

若客户端只能发送text/plain格式的JSON内容,可指定Body的媒体类型,手动解析同时保留文档显示:

from fastapi import FastAPI, Body
from pydantic import BaseModel
import json

class QA(BaseModel):
    question: str
    answer: str

app = FastAPI()

@app.post("/submit-qa")
async def submit_qa(raw_json: str = Body(..., media_type="text/plain")):
    qa_data = json.loads(raw_json, strict=False)
    qa = QA(**qa_data)
    return {"question": qa.question, "answer": qa.answer}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 12:45:47