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

Validation 何时/何地在FastAPI中使用正文/路径/查询/字段?,validation,metadata,fastapi,Validation,Metadata,Fastapi,我是FastAPI的追随者,到目前为止,我对何时/何地在FastAPI中使用Body/Path/Query/Field有疑问?因为它们的工作方式似乎都是一样的,教程对它们的区别使用了模糊的解释,还是我遗漏了什么 奖金问题:*真的有用吗?我在教程中设置/省略了它,但我看不出有什么区别。实际上,它们完全不同 让我们以使用FastAPI链接标记的问题的URL为例,并将其分成几个部分 https://stackoverflow.com/questions/tagged/fastapi?sort=Newe

我是FastAPI的追随者,到目前为止,我对何时/何地在FastAPI中使用Body/Path/Query/Field有疑问?因为它们的工作方式似乎都是一样的,教程对它们的区别使用了模糊的解释,还是我遗漏了什么


奖金问题
*
真的有用吗?我在教程中设置/省略了它,但我看不出有什么区别。

实际上,它们完全不同

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

https://stackoverflow.com/questions/tagged/fastapi?sort=Newest&uqlId=26120
  • stackoverflow.com->domain
  • /问题->路径
  • /taged->路径
  • /fastapi->路径参数
  • 排序=最新的查询参数
  • uqlId=26120->查询参数
如果您想在FastAPI中创建它,它看起来会像这样

从枚举导入枚举
类排序类型(str、Enum):
最新:str=“最新”
未回答:str=“未回答”
活动:str=“活动”
悬赏:str=“悬赏”
@app.get(“/questions/taged/{tag}”)
异步def获取带有标记的问题(标记:str,排序:SortTypes,uqlId:int):
返回。。。
查询参数和路径参数的工作原理几乎相同

但是身体是完全不同的

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

这样做,就是告诉服务器应该如何处理该主体。比如说

假设您正在发送一个JSON
{“name”:“foo”}
,它将与此标题一起发送
{“Content Type”:“application/JSON”}
,您的客户端将处理此问题,因为默认情况下FastAPI返回
JSONResponse
,还有其他响应类型,如
StreamingResponse
FileResponse
HTMLResponse
etc(您可以从中读取常见内容类型)

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

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

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

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


这是否回答了您的问题?不,但是谢谢你的帖子,它在某种程度上有所帮助。谢谢@yagizcan degirmenci,我对查询和路径参数,以及查询、路径、正文和字段有更好的理解。我想你可以用这个调用来补充你对Body的有价值的解释:
curl-xput”http://127.0.0.1:8000/items4/345?q=holmes“-H”accept:application/json“-H”内容类型:application/json“-d”{“item\”:{“name\”:“string\”,“description\”:“string\”,“price\”:0,\“tax\”:0},\“user\:{“username\”:“string\”,“full\u name\:”字符串\“}、\“重要性\”:1}“
@БιλιαμΑρκεεε-ε-oh ofc,但正文可以是任何类型、图像、base64编码字符串、JSON或字节对象等。我将更新我的答案,对正文进行更好的解释。非常感谢。