我有一个REST API,可以使用GET提供对资源的访问。
使用此方法,我可以获得特定实例或所有实例。
在这种情况下,一个实例是不够的,而且一切都太多了。
我所做的是使用/ api / filteredresource这样的模式创建一个新的Controller,并使用包含过滤器表示的主体的POST请求来限制返回的项目列表。
我不是在寻找一个“我如何...”的答案,更多的是“我应该这样做......”一个。
这里的besrt练习是什么?
This StackOverflow article似乎暗示我不应该这样做,因为数据canno(或者更确切地说不应该)被缓存但在此实例中缓存这个过滤后的数据没有意义。我想我正在寻找一个实用的答案,而不是技术上正确的答案。
**编辑** 初始要求是仅搜索与特定状态匹配的资源实例,但似乎这是“第一步”。他们有一个他们想要使用的“搜索键”包含各种匹配的属性,在很多情况下,是资源本身的元素,他们希望能够使用这个“搜索键”(或它的表示)过滤器。 **结束编辑**
答案 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',不要担心。