具有请求主体的HTTP GET,用于限制字段和过滤

时间:2019-07-24 10:09:14

标签: json rest graphql odata http-get

我目前正在使用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
      }
   }
}  

对此方法有何评论?

1 个答案:

答案 0 :(得分:2)

  

我在想是否可以使用http-GET方法传入json正文以对其进行存档。

这是违反规则的。

RFC 7231

  

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

不能保证通用的HTTP兼容组件了解您要对请求执行的操作。

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

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

如果您无法通过URI传达所需的参数(例如,通过将JSON主体编码到请求部分中),那么正确的做法是退回到POST,这在语义上是是正确的,但是a并没有与通用组件交流您希望它们理解的只读语义。