提问人:Ουιλιαμ Αρκευα 提问时间:11/20/2020 最后编辑:Ουιλιαμ Αρκευα 更新时间:11/21/2020 访问量:8102
何时/何地在 FastAPI 中使用 Body/Path/Query/Field?
When/Where to use Body/Path/Query/Field in FastAPI?
问:
我正在按照 FastAPI 的教程进行操作,到目前为止,我对何时/何地在 FastAPI 中使用 Body/Path/Query/Field 有疑问? 因为它们似乎都以相同的方式工作,所以本教程对它们的区别使用了模糊的解释,或者我遗漏了什么?
奖励问题:真的有用吗?我已经在教程的示例代码中设置/省略了它,但我看不出有什么区别。*
答:
实际上,它们是完全不同的。
我们以带有 FastAPI 链接标记的问题的 URL 为例,拆分为多个部分。
https://stackoverflow.com/questions/tagged/fastapi?sort=Newest&uqlId=26120
- stackoverflow.com ->域
- /questions ->路径
- /tagged -> 路径
- /fastapi -> 路径参数。
- sort=Newest -> 查询参数。
- uqlId=26120 -> 查询参数。
如果你想在 FastAPI 中创建它,它看起来像这样。
from enum import Enum
class SortTypes(str, Enum):
newest: str = "Newest"
unanswered: str = "Unanswered"
active: str = "Active"
bountied: str = "Bountied"
@app.get("/questions/tagged/{tag}")
async def get_questions_with_tags(tag: str, sort: SortTypes, uqlId: int):
return ...
查询参数和路径参数的工作方式几乎相同。
但身体完全不同。
您看不到来自 URL 的请求的正文,您的客户端以字节形式发送 HTTP 正文,但它可以包含任何内容,并且您需要通过 HTTP 标头指定正文包含的内容。
通过这样做,您可以告诉服务器它应该如何处理该正文。例如
想象一下,您正在发送一个 JSON,它将与此标头一起发送,您的客户端会处理此问题,因为默认情况下 FastAPI 返回,还有其他响应类型,例如 、 等(您可以从此处读取常见的 Content-Type)。{"name": "foo"}
{"Content-Type": "application/json"}
JSONResponse
StreamingResponse
FileResponse
HTMLResponse
Query 参数和 Path 参数之间的主要区别在于它们可以从 URL 访问,并且是字符串。但 Body 只是,通常,它携带数据。
想象一下,你有一个更大的应用程序,你正在使用参数进行客户端和服务器之间的所有通信。这将是一场彻头彻尾的灾难。Query
例如,现在您正在阅读此答案,对吗?但它是怎么来的呢?所有细节,你的身份,你的声誉,问题本身都是身体。想象一下,在URL中发送所有这些内容,完全是灾难。
如需进一步阅读,您可以查看这些答案,查看设计 REST API 的最佳实践。
评论
curl -X PUT "http://127.0.0.1:8000/items4/345?q=holmes" -H "accept: application/json" -H "Content-Type: application/json" -d "{\"item\":{\"name\":\"string\",\"description\":\"string\",\"price\":0,\"tax\":0},\"user\":{\"username\":\"string\",\"full_name\":\"string\"},\"importance\":1}"
评论