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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 01:55:37