我实际上正在重写我们工作中的一些 API(在 ASP.Net Core 3.1 中),并尝试使它们成为 RESTFull。我遇到一些方法,应该使用 HTTP GET 调用它,因为它用于检索一些数据,但参数包装在一个相当大的 DTO 中。
所以我问自己如何应对:
我认为更好的解决方案是将 HTTP Get 与 body 一起使用(根据这篇文章https://thecodebuzz.com/http-get-delete-request-body-guidelines/这是可能的)
有人遇到同样的问题吗?现在的指导方针是什么?
谢谢你的想法
Voi*_*son 18
\n\n我认为更好的解决方案是将 HTTP Get 与 body 一起使用
\n
RFC 7231不这么认为:
\n\n\nGET 请求消息中的有效负载没有定义的语义;在 GET 请求上发送有效负载正文可能会导致某些现有实现拒绝该请求。
\n
您不能指望通用组件对主体执行有用的操作。例如,缓存将使用 target-uri 作为主缓存键,并且根本不会考虑主体。所以很可能存在奇怪的行为。
\n实际上,只有当您控制客户端、Web 服务器以及两者之间的组件时,带有主体的 GET 才会起作用。如果那样的话情况,您不妨使用您希望它具有的语义来定义您自己的 HTTP 方法。
\n例如,您可能会查看HTTP SEARCH,看看这些语义是否更适合您想要做的事情。
\n也就是说,如果您尝试在线条内着色,可以使用 POST。
\n\n\nPOST 在 HTTP 中具有许多有用的用途,包括 \xe2\x80\x9c 的一般用途,此操作 \xe2\x80\x99 不值得标准化。\xe2\x80\x9d
\n
\n\n它不是 REST,因为应该使用 POST 来创建数据
\n
REST 不定义任何类型的“创建”约束。REST 表示“使用统一接口中定义的适当方法”;HTTP 说“当没有更具体的方法适合时使用 POST”。
\n但是,如果您处于一个不接受这一点的环境中……在不“违反规则”的情况下实现您想要的效果的一种方法是考虑创建一个新资源,该资源是您的查询结果。因此,我们 POST 一些信息,该信息与服务器控制的新 URI 相关联,然后后续尝试 GET 资源会得到您想要的结果。
\nPOST /foo\n\n201 Created\nLocation: /c30e910e-7baa-4c31-9481-4c84c12884a1 \n...Other Headers...\n\nRun Code Online (Sandbox Code Playgroud)\nGET /c30e910e-7baa-4c31-9481-4c84c12884a1\n\n200 OK\nContent-Location: /c30e910e-7baa-4c31-9481-4c84c12884a1\n...Other Headers...\n\nThe Answer\nRun Code Online (Sandbox Code Playgroud)\n遵循标准,您可以结合这两个想法来节省往返时间
\nPOST /foo\n\n201 Created\nLocation: /c30e910e-7baa-4c31-9481-4c84c12884a1 \nContent-Location: /c30e910e-7baa-4c31-9481-4c84c12884a1\n...Other Headers...\n\nThe Answer\nRun Code Online (Sandbox Code Playgroud)\n从那里,这是一小步
\nPOST /foo\n\n200 OK\n...Other Headers...\n\nThe Answer\nRun Code Online (Sandbox Code Playgroud)\n
时至今日仍令人气馁。用于设计API定义的OAS3.0甚至不允许这样做。
您是否阅读过一些 REST 设计原则: Hackernoon 或风格指南Adidas API 指南 ?
他们将帮助您迈向安宁的道路。如果您有需要过滤的“集合资源”,请使用查询参数(如果它确实很复杂),那么它是搜索,在这种情况下通过“控制器资源”发布正文。
如果您想提供有关用例的更多详细信息,这里的人将很乐意提供帮助。
| 归档时间: |
|
| 查看次数: |
46415 次 |
| 最近记录: |