何时/何地在 FastAPI 中使用正文/路径/查询/字段?

Ουι*_*ευα 3 validation metadata fastapi

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

奖金问题*真的有用吗?我在教程的示例代码中设置/省略了它,但我没有看到区别。

Yag*_*nci 6

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

我们以标有 FastAPI 链接的问题 URL 为例,拆分成几个部分。

/sf/ask/tagged/fastapi/?sort=Newest&uqlId=26120
Run Code Online (Sandbox Code Playgroud)
  • stackoverflow.com -> 域
  • /questions -> 路径
  • /标记-> 路径
  • /fastapi -> 路径参数。
  • sort=Newest -> 查询参数。
  • uqlId=26120 -> 查询参数。

如果你想在 FastAPI 中创建它,它看起来像这样。

https://stackoverflow.com/questions/tagged/fastapi?sort=Newest&uqlId=26120
Run Code Online (Sandbox Code Playgroud)

查询参数和路径参数的工作方式几乎相同。

但身体完全不同。

您无法看到来自 URL 的请求的正文,您的客户端以字节形式发送 HTTP 正文,但它可以包含任何内容,您需要通过 HTTP 标头指定正文包含的内容。

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

想象一下,你正在发送JSON {"name": "foo"},它会用这个标题来发送{"Content-Type": "application/json"},您的客户端处理这一点,因为在默认情况下FastAPI回报JSONResponse,也有其他响应类型一样StreamingResponseFileResponseHTMLResponse等(你可以阅读从普通的Content-Type的位置)。

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

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

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

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