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

