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