何时/何地在 FastAPI 中使用 Body/Path/Query/Field?

When/Where to use Body/Path/Query/Field in FastAPI?

提问人:Ουιλιαμ Αρκευα 提问时间:11/20/2020 最后编辑:Ουιλιαμ Αρκευα 更新时间:11/21/2020 访问量:8102

问:

我正在按照 FastAPI 的教程进行操作,到目前为止,我对何时/何地在 FastAPI 中使用 Body/Path/Query/Field 有疑问? 因为它们似乎都以相同的方式工作,所以本教程对它们的区别使用了模糊的解释,或者我遗漏了什么?

奖励问题:真的有用吗?我已经在教程的示例代码中设置/省略了它,但我看不出有什么区别。*

验证 元数据 fastapi

评论

0赞 Yagiz Degirmenci 11/20/2020
这回答了你的问题吗?何时在 RESTful API 中使用路径参数与查询参数?
0赞 Ουιλιαμ Αρκευα 11/21/2020
不,但感谢您的帖子,它在某种程度上有所帮助。

答:

13赞 Yagiz Degirmenci 11/21/2020 #1

实际上,它们是完全不同的。

我们以带有 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"}JSONResponseStreamingResponseFileResponseHTMLResponse

Query 参数和 Path 参数之间的主要区别在于它们可以从 URL 访问,并且是字符串。但 Body 只是,通常,它携带数据。

想象一下,你有一个更大的应用程序,你正在使用参数进行客户端和服务器之间的所有通信。这将是一场彻头彻尾的灾难。Query

例如,现在您正在阅读此答案,对吗?但它是怎么来的呢?所有细节,你的身份,你的声誉,问题本身都是身体。想象一下,在URL中发送所有这些内容,完全是灾难。

如需进一步阅读,您可以查看这些答案,查看设计 REST API 的最佳实践。

评论

0赞 Ουιλιαμ Αρκευα 11/21/2020
感谢 @yagizcan-degirmenci,我更了解查询和路径参数,因此更了解 QUERY、PATH、BODY、FIELD。我认为你可以用这个电话来补充你对身体的宝贵解释: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}"
1赞 Yagiz Degirmenci 11/22/2020
@ΟυιλιαμΑρκευα哦,但正文可以是任何类型、图像、base64 编码字符串、JSON 或字节对象等。我会用对身体的更好解释来更新我的答案。谢谢。
0赞 Benyamin Jafari 10/22/2023
如何将正文 parm 也添加到端点定义中?