平时jq ajax跑的通的post请求,换fastapi就报HTTP 422 Unprocessable Entity

字号+ 编辑: 种花家 修订: 种花家 来源: 原创 2024-07-03 我要说两句(0)

这个坑不能算是python框架大佬挖的,这种情况下我们不该考虑重构后端接口。有些时候是处于无奈,上头领导命令下来了,只能执行,这篇文章就说说如何处理。

首先打开chrome开发者工具一调试,会发现jq的ajax请求类型是标准的封装好的xhr请求,并不是post。这样一来fastapi框架就不认为这个ajax请求所传过来的参数是post,这样一来,后端接口逻辑讲也就认为没有合法的参数传进来。

现象就是,比如你有2个参数,分别是param_a, param_b,后端除了返回422报错之外,还会给你以下的响应实体

{
    "detail": [{
        "type": "missing",
        "loc": [
            ...,
            "param_a"  // <---找不到param_a
        ]
        "msg": "Field required",
        "input": "null"
        },
        {
        "type": "missing",
        "loc": [
            ...,
            "param_b"  // <---找不到param_b
        ]
        "msg": "Field required",
        "input": "null"
        },
    ]
}

意思是你一个参数都没传进来,怎么处理呢?

在fastapi后端逻辑上,把方法参数写成类似以下的样子:

from fastapi import Cookie, Form

@router.post("/pythonapi/foo")
async def foo(
    param_a: int = Form(...),  # 注意这里为参数param_a
    param_b: str = Form(...),  #  注意这里为参数param_b
    # some_cookie_a: str = Cookie('cookie_key_a')  # 这里不用管, 我随便写的
):

后面的= Form(...) 意思就是用Form表单的格式读取,别忘了标头import一下Form

前端ajax要做一下标注

contentType: 'application/x-www-form-urlencoded'

举例说明

$.ajax({
    url: "/pythonapi/foo",
    type: 'POST',
    data: {
        param_a: someInt,
        param_b: someText,
    },
    contentType:'application/x-www-form-urlencoded',
    dataType: 'JSON', success: (r) => {
        // todo
    }, complete: () => {
        // todo
    }
});

完结撒花

阅完此文,您的感想如何?
  • 有用

    0

  • 没用

    0

  • 开心

    0

  • 愤怒

    0

  • 可怜

    0

1.如文章侵犯了您的版权,请发邮件通知本站,该文章将在24小时内删除;
2.本站标注原创的文章,转发时烦请注明来源;
3.Q群: 2702237 13835667

相关课文
  • 通过i参数使用国内镜像给pip安装提速

  • Conda删除不用的虚拟环境

  • flask框架知识点总结

  • linux - centos 7.x安装python3.10教程

我要说说
网上嘉宾点评