平時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教程

我要說說
網上賓友點評