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