When/Where 在 FastAPI 中使用 Body/Path/Query/Field?

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

我正在关注 FastAPI 的 the tutorial,到目前为止我对 When/Where 在 FastAPI 中使用 Body/Path/Query/Field 有疑问? 因为它们似乎都以相同的方式工作,本教程对它们的 区别 使用了模糊的解释,还是我遗漏了什么?

奖金问题*真的有用吗?我在 the sample code 的教程中 set/omitted 它,但我看不出有什么不同。

其实完全不同

我们以URL标签为FastAPIlink的问题为例,拆分成几个部分。

https://whosebug.com/questions/tagged/fastapi?sort=Newest&uqlId=26120
  • whosebug.com -> 域
  • /问题 -> 路径
  • /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 ...

查询参数和路径参数几乎相同。

但是body完全不同

您无法看到来自 URL 的请求的 body,您的客户端以字节形式发送 HTTP Body 但它可以包含任何内容,并且您需要指定 body 包含通过 HTTP Headers.

通过这样做,您告诉服务器它应该如何处理 body。例如

假设您正在发送一个 JSON {"name": "foo"} 并且它将与此 header {"Content-Type": "application/json"} 一起发送,您的客户端会处理这个因为默认情况下 FastAPI returns JSONResponse,还有其他响应类型,如 StreamingResponseFileResponseHTMLResponse 等(您可以阅读常见的 Content-Type here).

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

假设您有一个更大的应用程序,并且您正在使用 Query 参数进行客户端和服务器之间的所有通信。这将是一场彻底的灾难。

例如,你现在正在阅读这个答案对吗?但是它是怎么来的呢?您的 ID、您的声誉、问题本身的所有详细信息都来自 body。想象一下在 URL 中发送所有这些,完全是灾难。

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