我目前正在使用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
}
}
}
对此方法有何评论?
答案 0 :(得分:2)
我在想是否可以使用http-GET方法传入json正文以对其进行存档。
这是违反规则的。
GET请求消息中的有效负载没有定义的语义;在GET请求上发送有效内容正文可能会导致某些现有实现拒绝该请求。
不能保证通用的HTTP兼容组件了解您要对请求执行的操作。
从根本上讲,HTTP基于这样一种思想,即资源的URI用作缓存键,可用于优化资源的检索并减少网络负载。 URI和请求正文一起应作为键的情况没有任何意外情况。
REST取决于在许多实现中共享的语义。在HTTP中,许多实现都同意规范定义的统一接口。当您尝试单方面更改该界面时,就会失去其提供的好处。
如果您无法通过URI传达所需的参数(例如,通过将JSON主体编码到请求部分中),那么正确的做法是退回到POST
,这在语义上是是正确的,但是a并没有与通用组件交流您希望它们理解的只读语义。