平時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.交流群: 2702237 13835667

相關課文
  • 通過i參數使用國内鏡像給pip安裝提速

  • Conda刪除不用的虛擬環境

  • flask框架知識點總結

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

我要說說
網上賓友點評