FastAPI接收Jira Webhook payload返回422错误求助
解决FastAPI接收Jira Webhook时的422 JSON解析错误
问题根源
Jira Service Management发送的Webhook payload中,description字段包含未转义的换行符(\n),而标准JSON要求字符串内的控制字符必须转义为\\n,导致FastAPI默认的JSON解析器报错422 Unprocessable Entity。
解决方案
方案1:全局修改FastAPI的JSON解码器,允许未转义控制字符
通过自定义JSON解码器,放宽Python json.loads的严格模式,允许未转义的换行符:
from fastapi import FastAPI, Request from pydantic import BaseModel import json app = FastAPI() # 自定义JSON解析逻辑,关闭strict模式 async def custom_json_parser(request: Request): raw_body = await request.body() return json.loads(raw_body, strict=False) # 覆盖FastAPI默认的Request.json方法 app.dependency_overrides[Request.json] = custom_json_parser class Data(BaseModel): description: str @app.post("/desc") def read_desc(data: Data): print(data.description) return {"Data": data}
方案2:单独处理原始请求体
如果不想全局修改解码器,可以在接口中直接读取原始请求体,手动转义控制字符后再解析:
from fastapi import FastAPI, Request from pydantic import BaseModel import json app = FastAPI() class Data(BaseModel): description: str @app.post("/desc") async def read_desc(request: Request): raw_body = await request.body() # 将未转义的换行符替换为转义后的\\n processed_body = raw_body.replace(b'\n', b'\\n') # 处理其他可能的控制字符(如\r) processed_body = processed_body.replace(b'\r', b'\\r') data_dict = json.loads(processed_body) data = Data(**data_dict) print(data.description) return {"Data": data}
方案3:调整Jira Webhook的payload配置(优先推荐)
如果有权限修改Jira Automation的Webhook设置,直接让Jira自动转义description字段的控制字符是最规范的做法。比如在Jira的payload模板中,使用Jira提供的字符串转义函数(如{{ issue.description | escapeJson }})处理字段内容,确保发送的JSON符合标准规范。
补充说明
- 标准JSON规范(RFC 8259)明确要求字符串中的换行符、回车符等控制字符必须转义,Jira直接发送未转义的内容属于不规范的JSON输出。
- Postman测试时你发送的是转义后的内容,所以解析正常;其他无控制字符的字段(如
summary)也能正常解析,进一步验证了问题出在未转义的控制字符上。
内容的提问来源于stack exchange,提问作者kybosha
相关产品推荐
相关产品推荐

