当前位置: 首页 > 知识库问答 >
问题:

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

公良琛
2023-03-14

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

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

共有1个答案

袁永贞
2023-03-14

事实上,他们完全不同。

让我们以FastAPI链接标记的问题的URL为例,并将其分成几个部分。

https://stackoverflow.com/questions/tagged/fastapi?sort=Newest&uqlId=26120
  • 堆栈溢出。com-

如果你想在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{“name”:“foo”},它将与这个头一起发送{“Content Type”:“application/JSON”},您的客户机会处理这个问题,因为默认情况下FastAPI返回JSONResponse,还有其他响应类型,比如StreamingResponseFileResponseHTMLResponseetc(您可以从这里阅读常见的内容类型)。

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

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

例如,现在你正在阅读这个答案,对吗?但它是怎么来的?你的身份证、名声和问题本身的所有细节都以身体的形式出现。想象一下,把这一切都发送到URL中,简直是灾难。

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

  • REST API最佳实践:参数放在哪里
 类似资料:
  • 嗨, 我正在创建Rest API,这是我的问题。例如,我有这样的@Query。 如何从我的类OrderDto中获取值并将其发送到@查询? 我还有其他问题,例如,我只发送一个单词,在这里我只需要使用: orderId来使用incoming String,但不知道如何将其用于incoming类。有什么想法吗? 我只想用同样的例子,但是从OrderDto到userDto这样的类。getCustomer

  • 我想在一个JpaRepository中使用一个命名查询。但它不起作用: 结果: 更新: 仍然相同的例外:

  • 我正在将一个服务从Flask迁移到FastAPI,并使用Pydantic模型来生成文档。但是,我对模式检查有点不确定。我担心会有一些意想不到的数据(如不同的字段格式),它会返回一个错误。 在Pydantic文档中,有一些方法可以在不检查模式的情况下创建模型:https://Pydantic-docs . help manual . io/usage/models/# creating-models

  • 使用 ORM,我想做一个 POST 请求,让一些具有值的字段,这些字段将在数据库中转换为那里指定的默认值。 问题是OpenAPI(Swagger)文档忽略默认的,并且默认情况下仍然提示。 在我们找到的文档中的OpenAPI模式示例(请求正文)中: 这是不行的,因为我指定默认值为 ,所以我期望这样做: 这会将一个 传递给 ,最后将在数据库中解析为默认值(即新生成的

  • 我正在使用我的房间持久性库来访问数据库数据。 在我的道课上,我把查询写成 这很好。但是,如果我必须将状态与某个常量值进行比较,例如状态!=Constant.STATUS_FAILED 这里,val STATUS_FAILED=5在常量文件中定义。 我如何在查询中使用它。我知道我可以在allContacts方法中将它作为参数传递,并使用like status!= :stts。但是我不想那样。有没有什

  • 我在做泽西服务。当我导入时,我在NIO中遇到了注释和路径接口的问题。 错误是“类型不明确”,这对我来说是有意义的。但我不知道该如何解决。