RESTful API 设计。当请求带有过滤器时,您是否也应该 return 该过滤器的值?

RESTful API design. When request comes with a filter should you return the values for that filter too?

假设客户端对 /items/color/{color}

发出 GET 请求

当服务器 returns 对象数组具有所述颜色时,每个项目对象是否应该具有颜色 属性?

客户端知道 returned 项目的颜色,因为他请求了那种颜色,所以服务器应该尝试使响应大小变小还是不?

编辑:大家可以多谈谈节省带宽的部分吗?如果 return 整个资源更好,答案是否可以包括为什么 return 整个资源比节省带宽更好,而不是为什么应该 return 编辑整个资源。

一般来说(至少这是我所理解的 REST 的想法),请求的结果应该总是 完整的资源 。如果项目包含成员 color,则没有理由在结果中隐藏该成员。这将与 REST 的资源概念相矛盾。资源不会更改其属性。

抑制成员不仅会出乎意料,甚至可能会在客户端实际需要该成员时破坏客户端。

假设客户端具有无需过滤器即可解析 REST 调用结果的功能。所有字段都将被 returned,客户端将解析所有字段。现在客户端请求完全相同的资源(item),但突然字段不同 - 上面解析结果的代码无法重用。

此外,当您考虑它时,压制该成员可能比仅 return 它需要更多工作。

没有"correct"答案,这取决于一般API设计,应该由您决定。

我同意 Thorstens 的评论,即您应该 return 整个资源 - 这接近于一般的 REST 想法。在这样做的同时,您还可以实现一些选择字段的机制,例如在 FB API 中:请参阅 this paragraph 的 "Choosing fields" 部分。

您应该在回复中保留颜色。这有多种原因:

  • 您确保所求即所得
  • 如果页面中有多个不同颜色的项目,您不要让客户端根据颜色处理"filtering"项目
  • 您有更多 "secure" 回复。例如,客户端请求 blue color ,但随后恶意脚本会将此响应操纵为红色项。