使用GET管理复杂数据

时间:2015-03-23 04:49:19

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

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

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

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

这是一个没有数组的简单请求。数组只会使问题更加严重。

所以,我的问题是如何在没有JSON主体的情况下管理复杂的GET请求?我在做什么/想错了什么?为什么我们不能拥有GET的身体?

是的,我可以使用网址参数发送此请求,但这会让生活变得更加困难,尤其是当您需要发送过滤器,分页以及不需要的内容时......

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

2 个答案:

答案 0 :(得分:0)

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

我认为这取决于您要在请求中处理的查询的复杂性。您可以将此功能与查询参数一起使用,但如果使用查询参数设置查询过于复杂,则可以使用方法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

希望它可以帮到你, 亨利

答案 1 :(得分:0)

  

我厌倦了所有的困难,并改变了这样的GET请求   POST。我知道这是错误的(因此问题),但感觉就像是巨大的   从肩膀上卸下来。

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

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

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

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