首先打開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 } });
完結撒花