【问题标题】:HTTP GET with request body to limit fields and filter [duplicate]带有请求正文的 HTTP GET 以限制字段和过滤 [重复]
【发布时间】:2019-12-02 11:02:30
【问题描述】:

我目前正在研究 REST API。我喜欢 GraphQL 或 OData 的想法,它允许开发人员选择要返回的列/字段和关系记录。但是 GraphQL 需要迁移,并且 oData 的查询字符串太长。我在想是否可以使用 http-GET 方法传入 json 正文来存档。 例如,使用 http-Get 为客户检索客户名称“Luke Skywalker”

{  
   "customers":{  
      "Id":null,
      "name":"Luke Skywalker",
      "height":null,
      "DateOfBirth":null,
      "Cars":{  
         "manufacturer":"BMW",
         "model":null,
         "Plate":null
      }
   }
}

在下面获取相同的客户名称,但在发票信息上

{  
   "customers":{  
      "Id":null,
      "name":"Luke Skywalker",
      "height":null,
      "DateOfBirth":null,
      "Invoices":{  
         "Year":2019,
         "Outstanding":Yes,
         "OutstandingAmount":null
      }
   }
}  

对这个方法有什么意见吗?

【问题讨论】:

  • A payload within a GET request message has no defined semantics; sending a payload body on a GET request might cause some existing implementations to reject the request. 来源:RFC 7231
  • 除此之外,GraphQL 只是 RPC。它与 REST 试图实现的目标几乎没有任何关系——客户端与服务器的分离。在 REST 中,客户端是服务器选项,客户端可以选择用于执行任务。这不需要 API 的内部知识,因为所需的一切都由 API 提供。另一方面,GraphQL 需要一些可用字段的内部知识,因此与 API 紧密耦合。这就是为什么 GraphQL 不适合 REST!
  • 我的 REST API 仅针对我自己的应用程序,因此“在 GET 请求上发送有效负载主体可能会导致某些现有实现拒绝该请求。”不适用于我的情况。 PostMan 最近也开始允许 GET 在体内进行测试。 stackoverflow.com/questions/978061/http-get-with-request-body 如果不使用 HTTP GET 方法,那么 'Patch' 来实现 GraphQL 或 OData 类似功能呢?

标签: json rest graphql odata http-get


【解决方案1】:

我在想是否可以使用 http-GET 方法传入 json body 来存档。

这是违反规则的。

RFC 7231

GET 请求消息中的有效负载没有定义的语义;在 GET 请求上发送有效负载正文可能会导致某些现有实现拒绝该请求。

不保证通用 HTTP 兼容组件能够理解您尝试对请求执行的操作。

从根本上说,HTTP 是基于资源的 URI 作为缓存键的思想,可用于优化资源的检索并减少网络负载。对于 URI 和请求正文一起应作为键的情况,没有可用的意外情况。

REST 依赖于许多实现共享的语义;在 HTTP 中,许多实现都同意规范定义的统一接口。当您尝试单方面更改该界面时,您将失去它提供的好处。

如果您无法通过 URI 传递所需的参数(例如,通过将 JSON 正文编码到请求部分),那么正确的做法是使用 POST,这在语义上是正确的,但唉,不会向通用组件传达您希望它们理解的只读语义。

【讨论】:

    猜你喜欢
    • 2019-10-25
    • 1970-01-01
    • 2015-07-02
    • 1970-01-01
    • 2017-01-27
    • 2020-09-07
    • 2016-08-24
    • 2012-11-20
    相关资源
    最近更新 更多