0

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

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

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

我所做的是创建一个具有 /api/filteredresource 之类的模式的新控制器,并创建一个 POST 请求,其主体包含过滤器的表示,用于限制返回的项目列表。

我不是在寻找“我如何……”的答案,而是“我应该这样做……”的答案。

这里最好的做法是什么?

这篇 StackOverflow 文章似乎建议我不应该这样做,因为数据不能(或更确切地说不应该)被缓存,但在这种情况下缓存这些过滤的数据没有意义。我想我正在寻找一个务实的答案,而不是一个技术上正确的答案。

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

4

2 回答 2

1

使用查询参数进行过滤:

GET /rest/things/1

得到的东西id=1

GET /rest/things

得到所有的东西。

GET /rest/things?color=yellow

只得到黄色的东西。

于 2013-11-05T09:23:13.703 回答
1

可以将 POST 用于任何未标准化的操作,但任何类型的检索都是标准化的,应该使用 GET 来完成。正如你所想,这取决于你想变得多么务实,以及你想在多大程度上坚持标准。

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

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

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

于 2013-11-05T22:27:26.683 回答