Python:具有发布请求的FastAPI错误422

时间:2020-01-27 10:15:08

标签: python python-requests axios fastapi

我正在构建一个简单的API以测试数据库。当我使用get request时,一切正常,但是如果我更改为post,则会收到“无法处理的实体”错误:

这是FastAPI代码:

from fastapi import FastAPI

app = FastAPI()

@app.post("/")
def main(user):
    return user

然后,我使用javascript的请求

let axios = require('axios')

data = { 
    user: 'smith' 
}

axios.post('http://localhost:8000', data)
    .then(response => (console.log(response.url)))

并使用Python

import requests

url = 'http://127.0.0.1:8000'
data = {'user': 'Smith'}

response = requests.post(url, json=data)
print(response.text)

我还尝试使用utf-8解析为json,并更改标头。对我没有任何帮助。

4 个答案:

答案 0 :(得分:4)

直接从documentation

将识别功能参数如下:

  • 如果在 path 中也声明了该参数,它将用作路径参数。
  • 如果参数为单数类型(例如int,float,str,bool等),它将被解释为 query 参数。
  • 如果该参数被声明为 Pydantic模型的类型,它将被解释为请求 body 。”

因此,要创建一个接收带有用户字段正文的POST端点,您将执行以下操作:

from fastapi import FastAPI
from pydantic import BaseModel


app = FastAPI()


class Data(BaseModel):
    user: str


@app.post("/")
def main(data: Data):
    return data

答案 1 :(得分:3)

就我而言,我正在像这样从不同的 python 项目调用 python API

queryResponse = requests.post(URL, data= query)

我正在使用数据属性,我将其更改为 json,然后它对我有用

queryResponse = requests.post(URL, json = query)

答案 2 :(得分:1)

对于采用请求正文的POST请求,您需要执行以下操作

创建一个Pydantic基本模型用户

from pydantic import BaseModel

class User(BaseModel):
    user_name: str


@app.post("/")
def main(user: User):
   return user

答案 3 :(得分:0)

FastAPI基于 Python类型提示,因此当您传递查询参数时,除了对之外,您都需要以某种方式对其进行声明

即使是这样的东西也可以工作

from typing import Dict, Any
...
@app.post("/")
def main(user: Dict[Any, Any] = None):
    return user

Out: {"user":"Smith"}

但是使用Pydantic方法更有效

class User(BaseModel):
    user: str

@app.post("/")
def main(user: User):
    return user

Out: {"user":"Smith"}