【问题标题】:Managing complex data with GET使用 GET 管理复杂数据
【发布时间】:2015-05-26 00:59:48
【问题描述】:

我经常发现在不发送 JSON 正文的情况下很难管理复杂的 GET 请求。 URL参数只是不会削减它。如果我设法找到解决 URL 参数的方法,那么通常会增加更多的复杂性和混乱。

我不是网络开发人员,我没有做过任何大型应用程序,但即使是小型应用程序,我也有这样的要求:

{ page: { batch: 10, current: 1 }
, sort: { _id: -1 } 
, project: {history: 0, attach: 0}
, filter: { status: "new"}
}

这是一个没有数组的简单请求。数组只会让这更成问题。

那么,我的问题是如何在没有 JSON 正文的情况下管理复杂的 GET 请求?我在做什么/想错了什么?为什么我们不能使用 GET 获取 body?

是的,我可能可以使用 URL 参数发送这个请求,但它让生活变得更加困难,尤其是当您需要发送过滤器、分页等等时......

我厌倦了所有的困难,并将此类 GET 请求更改为 POST。 我知道这是错误的(因此是问题),但感觉就像我肩上的巨大负担。

【问题讨论】:

  • POST 请求有什么问题?
  • @Veselin Vasilev POST 没有问题。这就是我使用的。但是用 POST 请求对象列表感觉不对。因此,我的大多数 API 最终都变成了“无 GET”。拍摄结构化的 JSON 然后摆弄笨拙的 URL 参数要容易得多。
  • 使用POST请求获取资源是违反REST原则的。使用POST 进行分页/过滤请求是 RPC over HTTP。
  • @LutzHorn 错了。根据这个推理,任何 POST 的使用都是 RPC。在下面检查我的答案。
  • @PedroWerneck 不,那不是我写的。 POST 有一些有效的用法,比如创建一个集合资源的新子项(服务器为其分配完整的 URL)。

标签: rest http asp.net-web-api


【解决方案1】:

我厌倦了所有的困难,并将这样的 GET 请求更改为 邮政。我知道这是错误的(因此是问题)但感觉很大 减轻我的负担。

这根本不是真的。 POST 是执行 HTTP 未标准化的任何操作的方法。 GET 是标准化的检索,所以原则上你可以说使用 POST 来做你应该用 GET 做的事情是错误的,但是有一个问题......

绝对没有什么可以阻止您在 GET 请求中发送有效负载。 RFC 7231 说 GET 有效负载没有定义的语义,因此只要您记录它就可以包含它。由于没有标准语义,您必须为您的 API 生态系统确定一个统一的接口。然而,最大的问题是,尽管您的应用程序可以很好地处理 GET 有效负载,但您和您的客户端之间的许多 HTTP 实现可能不会。也许客户端或您的 HTTP 服务器会忽略它,或者缓存服务器不会缓存它,等等。

考虑到这一点,POST 也是用于规避损坏实现的方法。例如,许多公共 API 有一个 X-HTTP-Method-Override 标头,允许您使用 POST 方法发出 PUT 或 PATCH 请求,指定要在标头中使用的实际方法,以防中间的某些实现不理解 PUT 和补丁。

所以,在你的位置上,我会简单地使用 POST 并记录我是如何使用它的,就像你已经做过的那样;或者我会接受 GET 请求的有效负载,并允许客户端使用 POST 来使用有效负载发出请求,以防某些实现被破坏,为此设置一个覆盖标头。

【讨论】:

  • 好的。这个答案让我对自己的工作充满信心。我将继续使用 POST 进行复杂的查询,并且不会对此感到内疚/错误。谢谢。
  • 你提到了统一接口。带有正文的GET 请求的统一接口是什么?如果两个这样的请求仅在负载上有所不同,它们是针对相同的资源还是针对不同的资源?
  • 正如我所说,带有正文的 GET 没有定义的语义,所以这取决于你。当我使用它时,我认为正文与查询字符串参数具有相同的含义,但允许更复杂。缓存也可能被禁用,因为大多数缓存实现都会忽略 GET 主体。
【解决方案2】:

我认为这两个链接可以给你一些提示:

我认为这取决于您要在请求中处理的查询的复杂性。您可以使用查询参数来利用它,但如果使用它们来设计查询过于复杂,您可以使用方法 POST 并带有描述它的内容。

您可以查看 OData 管理此问题的方式(尤其是查询参数 $filter$count$orderby$skip$top)。有关详细信息,请参阅此链接:http://docs.oasis-open.org/odata/odata/v4.0/csprd01/part2-url-conventions/odata-v4.0-csprd01-part2-url-conventions.html#_Toc355091894

希望对你有帮助, 蒂埃里

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-31
    • 1970-01-01
    • 2020-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多