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

FastAPI接收Thunkable JSON请求时出现422 Unprocessable Entity错误

FastAPI + Thunkable + ngrok 出现422 Unprocessable Entity 错误排查解决

问题场景

开发FastAPI服务器接收JSON请求中的图片URL,本地测试(如Postman、浏览器插件)正常,但通过Thunkable结合ngrok发送请求时持续返回422错误。已确认请求头设置了Content-Type: application/json,ngrok inspect显示请求体格式符合预期。

FastAPI核心代码:

from fastapi import FastAPI, HTTPException
from pathlib import Path
from pydantic import BaseModel

app = FastAPI()

SAVE_PATH = Path("uploaded_images/")
SAVE_PATH.mkdir(parents=True, exist_ok=True)


class ImageData(BaseModel):
    image_url: str 

def process_image(file_path: str):
    print(f"Processing image at {file_path}")


@app.post("/upload-image/")
async def upload_image(data: ImageData):
    image_path = data.image_url
    print(image_path)
    return {"status": "success", "image_url": image_path}

Thunkable发送的请求体:

{
    "image_url": "http://res.cloudinary.com/dbamintid/image/upload/v1730294747/d09dfe8828ae73e48917b1c8925af291.jpg"
}

排查与解决步骤

1. 确认FastAPI实际接收的请求内容

422错误本质是请求体不符合Pydantic模型验证规则,即使ngrok显示请求体正确,也可能存在Thunkable发送时的隐藏问题。修改接口代码,打印原始请求头和请求体,定位真实问题:

from fastapi import Request

@app.post("/upload-image/")
async def upload_image(request: Request):
    # 打印原始请求头
    print("请求头:", dict(request.headers))
    # 读取并打印原始请求体
    raw_body = await request.body()
    print("原始请求体:", raw_body.decode("utf-8"))
    try:
        # 尝试解析JSON并手动验证模型
        data = await request.json()
        image_data = ImageData(**data)
        return {"status": "success", "image_url": image_data.image_url}
    except Exception as e:
        print("解析错误:", str(e))
        raise HTTPException(status_code=422, detail=str(e))

部署后重新测试,查看服务器控制台输出,确认实际接收的内容是否与预期一致。

2. 检查Thunkable的API请求配置

Thunkable的API组件容易出现以下配置问题:

  • 请求格式选错:确保选择Raw格式,类型设置为JSON,而非Form Data或x-www-form-urlencoded。
  • 自动添加额外字段:部分可视化工具会自动添加device_id、app_version等额外字段到请求体,导致Pydantic验证失败。
  • 引号转义错误:检查Thunkable中输入的JSON是否存在多余转义字符,比如把"image_url"写成\"image_url\"。

3. 兼容Form Data格式(备选方案)

如果Thunkable确实无法正确发送纯JSON,可修改FastAPI接口同时支持JSON和Form Data:

from fastapi import Form

@app.post("/upload-image/")
async def upload_image(image_url: str = Form(...)):
    print(image_url)
    return {"status": "success", "image_url": image_url}

之后在Thunkable中设置请求格式为Form Data,添加键为image_url的参数,值为目标图片URL。

4. 检查ngrok转发配置

确保ngrok转发的是FastAPI的正确端口(默认8000),且未开启请求修改类的插件或配置,避免请求体被篡改。

总结

422错误的核心原因是请求体与Pydantic模型不匹配,优先通过打印原始请求内容定位真实问题,再针对性调整Thunkable配置,或修改接口兼容发送格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 18:40:56