json - REST:创建基于 Json 的查询:使用哪种 http 方法?
问题描述
我对 RESTful 服务有疑问。在 REST 中,POST 方法用于创建实体。GET 用于查询实体。正确的?
正如我在另一篇文章中所读到的,HTTP 中不允许发送带有正文的 GET 请求。但是当我想发送 Json 进行查询时,最好的方法是什么?是否有任何最佳实践或如何解决此类 json 查询?
感谢您的回答
解决方案
在 REST 中,POST 方法用于创建实体。GET 用于查询实体。正确的?
并不真地。 GET用于获取资源的表示。 POST故意含糊不清——任何不值得标准化的东西都可以使用 POST。
当我想发送 Json 进行查询时,最好的方法是什么?
没有最好的办法,只能取舍。
HTTP 的基本情节是您获取资源的表示。如果您想要的资源不存在,则创建一个新资源。因此,“REST”流程看起来类似于向服务器发送请求以创建“我的查询的答案”资源,然后使用 GET 获取该资源的当前表示。这很好,因为我们可以在担心副本过期的任何时候获取该资源的最新表示。具有相同查询的其他人可以使用相同的资源,因此我们可以使用通用缓存来承担很多工作。最终结果是“网络规模”。
好吧,不是很好,因为我们了解到通过不安全的渠道发送信息是个坏主意;但是我们可以在我们的服务器前面放置一个通用缓存代理,并通过这种方式获得一定的规模。
但是,当您只希望查询一次时,“创建一个新资源”是很多仪式。
在这种情况下创建新资源无论如何都要使用 POST,那么为什么不立即返回解决方案的表示呢?答案是,继续前进!效果很好......但根本没有给你任何缓存支持。您正在以修改资源的名义有效地执行远程调用。
此外,POST 不承诺幂等语义——在不可靠的网络上,请求可能会丢失,通用组件不会知道在这种特殊情况下重复相同的请求是无害的。
PUT 具有幂等语义......但它也对与“查询”完全不匹配的有效负载内容有非常具体的意见。
您可以挖掘其他标准化方法,但实际上并没有任何合适的方法。唯一接近的方法是 SEARCH 和 REPORT,它们与 WebDAV 语义耦合。
您可以发明自己的非标准方法;但通用组件不会理解它。
您可以使用您需要的语义标准化一种新方法,但这需要大量工作。
或者你可以只使用 POST。
请记住,Web 仅使用 GET 和 POST 就占领了世界。所以应该没问题。
推荐阅读
- glsl - WebGL 雾着色器光标交互
- microsoft-cognitive - 使用 Microsoft 的 Academic Evaluate API 检索给定论文的引用
- ios - 捏手势后如何将UIView动画化回原始帧
- python - 在熊猫数据框上应用以字符串格式存储的过滤器
- c++ - 命令“new”和“malloc”没有正确分配内存
- jenkins - 当电子邮件 ID 正确时,发送到以下有效地址 Jenkins 时出错?
- php - laravel 为现有数据库设置模型
- html - 创建简单的 html 电子邮件需要哪些 html 标签?
- sql - 如何使用单个查询从一个表中获得基于两个不同条件的多个结果
- django - DRF - 通过 url 更改文件字段