我正在构建一个简单的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,并更改标头。对我没有任何帮助。
答案 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"}