FastApi 在 url 中处理 post 个参数
FastApi process post arguments in url
我正在使用 FastApi 构建简单的 api。这是我的 POST 请求处理程序:
@resources_router.post('', tags=['resources'])
async def post_resources(request: Resource): // where Resource is a Pydantic model
resource = parse_obj_as(Resource, request)
...
...
return resource.dict(exclude={'id', 'cost'})
并且测试此代码工作正常:
res1 = requests.post('http://0.0.0.0:8080/resources',
json.dumps({'title': 'good', 'amount': 1234, 'unit': 'gram', 'price': 12, 'date': '2007-07-07'}))
//Returns <Response [200]>
但是当我尝试在 url 中传递参数时,它以代码 422 响应
res2 = requests.post(url='http://0.0.0.0:8080/resources?title=good&amount=1234&unit=gram&price=12&date=2007-07-07')
// Returns <Response [422]>
{"detail":[{"loc":["body"],"msg":"field required","type":"value_error.missing"}]}
或者如果我的 post 处理程序如下所示:
@resources_router.post('', tags=['resources'])
async def post_resources_params(title: str, amount: float, unit: str, price: float, date: datetime.date):
resource = Resource(title=title,amount=amount,unit=unit,price=price,date=date)
...
...
return resource.dict(exclude={'id', 'cost'})
第一个请求 return 422,第二个 200。
我怎样才能使这两种类型的请求都正常工作?
如果需要资源模型:
class Resource(BaseModel):
title: str
id: Optional[int] = -1
amount: float
unit: str
price: float
cost: Optional[float] = 0
date: date
那是因为您在这两种情况下都没有发送正文。
从官方请求的文档中获取,你必须将 data
作为命名参数传递给你想要的正文内容
r = requests.post('https://httpbin.org/post', data = {'key':'value'})
查看完整文档
https://docs.python-requests.org/en/master/user/quickstart/#make-a-request
我正在使用 FastApi 构建简单的 api。这是我的 POST 请求处理程序:
@resources_router.post('', tags=['resources'])
async def post_resources(request: Resource): // where Resource is a Pydantic model
resource = parse_obj_as(Resource, request)
...
...
return resource.dict(exclude={'id', 'cost'})
并且测试此代码工作正常:
res1 = requests.post('http://0.0.0.0:8080/resources',
json.dumps({'title': 'good', 'amount': 1234, 'unit': 'gram', 'price': 12, 'date': '2007-07-07'}))
//Returns <Response [200]>
但是当我尝试在 url 中传递参数时,它以代码 422 响应
res2 = requests.post(url='http://0.0.0.0:8080/resources?title=good&amount=1234&unit=gram&price=12&date=2007-07-07')
// Returns <Response [422]>
{"detail":[{"loc":["body"],"msg":"field required","type":"value_error.missing"}]}
或者如果我的 post 处理程序如下所示:
@resources_router.post('', tags=['resources'])
async def post_resources_params(title: str, amount: float, unit: str, price: float, date: datetime.date):
resource = Resource(title=title,amount=amount,unit=unit,price=price,date=date)
...
...
return resource.dict(exclude={'id', 'cost'})
第一个请求 return 422,第二个 200。 我怎样才能使这两种类型的请求都正常工作?
如果需要资源模型:
class Resource(BaseModel):
title: str
id: Optional[int] = -1
amount: float
unit: str
price: float
cost: Optional[float] = 0
date: date
那是因为您在这两种情况下都没有发送正文。
从官方请求的文档中获取,你必须将 data
作为命名参数传递给你想要的正文内容
r = requests.post('https://httpbin.org/post', data = {'key':'value'})
查看完整文档
https://docs.python-requests.org/en/master/user/quickstart/#make-a-request