在Web Api而不是GET方法中使用POST方法。我是不是该?

时间:2013-11-05 09:10:38

标签: rest asp.net-web-api

我有一个REST API,可以使用GET提供对资源的访问。

使用此方法,我可以获得特定实例或所有实例。

在这种情况下,一个实例是不够的,而且一切都太多了。

我所做的是使用/ api / filteredresource这样的模式创建一个新的Controller,并使用包含过滤器表示的主体的POST请求来限制返回的项目列表。

我不是在寻找一个“我如何...”的答案,更多的是“我应该这样做......”一个。

这里的besrt练习是什么?

This StackOverflow article似乎暗示我不应该这样做,因为数据canno(或者更确切地说不应该)被缓存但在此实例中缓存这个过滤后的数据没有意义。我想我正在寻找一个实用的答案,而不是技术上正确的答案。

**编辑** 初始要求是仅搜索与特定状态匹配的资源实例,但似乎这是“第一步”。他们有一个他们想要使用的“搜索键”包含各种匹配的属性,在很多情况下,是资源本身的元素,他们希望能够使用这个“搜索键”(或它的表示)过滤器。 **结束编辑**

2 个答案:

答案 0 :(得分:1)

使用查询参数进行过滤:

GET /rest/things/1

获得id=1的内容。

GET /rest/things

获取所有事物。

GET /rest/things?color=yellow

只获得黄色的东西。

答案 1 :(得分:1)

对于任何非标准化操作都可以使用POST,但任何类型的检索都是标准化的,应该使用GET完成。如您所知,这取决于您想要的实用程度,以及您希望遵守标准的程度。

如果您的问题是查询字符串不易读或易于表示,并且真的想要坚持REST原则,那么您应该有query或{{1从属于您要过滤的filter的资源,然后在语义上正确使用一组过滤器参数进行POST。此POST应该向filteredresource返回带有Location URI的GET的303,其中的查询字符串将产生您期望的结果。由于这是由API生成的,并且不必是可读的,因此构建或读取的容易程度不应该是一个问题。该URI将是可缓存的,您将使用GET进行检索。

实用主义和纯粹主义之间的妥协是让POST简单地返回结果。

如果你想要务实,只需POST到`fiteredresource',不要担心。