【问题标题】:REST API having same object, but light具有相同对象但轻量级的 REST API
【发布时间】:2011-10-21 08:30:49
【问题描述】:

我们正在构建一个 REST API,我们希望返回相同的对象,但一个调用是“轻量级”版本(没有所有字段)

最佳做法是什么?

第一种情况

第二种情况

第三种情况

第四种情况?

欢迎提供任何指向 REST API 文档资源的链接!

谢谢。

【问题讨论】:

  • 在第三种情况下,您可能是指full=false 或交换网址。

标签: api rest


【解决方案1】:

这应该通过内容协商来处理,这就是它的用途。内容协商是客户端如何请求它想要查看的资源的哪种表示。以图片为例:image/x-canon-cr2, image/jpeg, image/png。

表面上都是相同的图像,但格式不同。

因此,这是您真正希望用于资源“精简”版本的机制。例如,您可以使用:

  • 主版本的“application/xhtml+xml”
  • "application/xhtml+xml; lite" 用于轻量级版本

所以,对于完整的资源:

GET /resource
Accept: application/xhtml+xml

对于精简版

GET /resource
Accept: application/xhtml+xml; lite

两者皆可,但更喜欢精简版:

GET /resource
Accept: application/xhtml+xml;lite, application/xhtml+xml

(更具体的说明符,即带有 ;lite 的说明符,比普通的 applciation/xhtml+xml 具有更高的优先级。)

如果您愿意,但更喜欢完整版:

GET /resource
Accept: application/xhtml+xml;lite;q=0.1, application/xhtml+xml

那些没有品质因数的默认为 1.0,因此 0.1 小于 1.0,如果在 lite 版本上可用,您将获得完整版本。

附录:

Accept 上的 q 因子有效地用于显示客户的偏好。它用于确定客户端接受的媒体类型列表的优先级。它说“我可以处理这些媒体类型,但我更喜欢 a over 和 b over c”。

JPEG 与 PNG 与精简版与完整版没有什么不同。 JPEG 看起来像原始 PNG 的事实是一种视觉错觉,数据大不相同,它们有不同的用途。 JPEG 不是“低质量”,而是不同的数据。这是“缺失的领域”。例如,如果我想要图像大小,JPEG 会像 PNG 一样为我提供该信息。在这种情况下,它的质量足以完成任务。如果这还不够,那么我不应该要求它。

我可以保证,如果我有一个只能处理 PNG 并请求 JPEG 的客户端,那么该程序将无法与它“正常工作”。如果我儿子想要鸡手指,而我给他菠菜奶油,就会有问题,尽管这两者都是资源/晚餐的代表。

“application/xhtml+xml;lite”表示就是这样——一种表示,它不是资源本身。这就是为什么使用表示这个词的原因。这些表示都是对实际资源的简单投影,实际资源是服务器上的某个虚拟实体,以某种未定义的方式在内部实现。

有些表示是规范的,有些则不是。

表示通过媒体类型表现出来,媒体类型通过 Con-neg 和 ACCEPT 标头处理。如果您无法处理代理,请不要要求。

这是一个否定问题。

我不知道“媒体播放器”与这个讨论有什么关系。

【讨论】:

  • 对于 RESTful API,这是一个有点脆弱的设计。此外,它是 ACCEPT 字段的非典型用法,它通常处理等效数据的替代表示(实际上并不改变显示的内容)。
  • 我认为有一个完整的有效案例可以证明 JPEG 是 RAW 图像的“轻量级”版本:它更小、有损并且不是资源的完美表示,但对于许多人来说已经足够了任务。如果客户端试图强制它返回服务,系统也很容易拒绝。与 text/plain 和 text/html 相同。这些都是完全可以接受的 ACCEPT 用法。我看不出这有什么不同。
  • 标头字段定义 (w3.org/Protocols/rfc2616/rfc2616-sec14.html) 显示类似 jpeg 示例的“质量级别”的内容。无论质量水平如何,用户仍然调用相同的媒体播放器来显示结果。与“lite”的不同之处在于,并非所有字段都被返回(不仅仅是质量较低,它是不同的数据集),并且可能无法与发出 HTTP 请求的程序同样好地工作。如果您仍然看不出这有何不同,也许只有评论者才能更好地解释它。
  • 我同意 Will Hartung 的观点。这就是 con-neg 的用途,而其他机制(同一资源的不同 URI 等)是更糟糕的解决方案。
  • 内容协商是为了让服务器“根据浏览器提供的媒体类型、语言、字符集和编码的偏好来选择资源的最佳表示形式。”它是关于相同数据的交替表示,而不是关于提供数据子集(行的范围或列的“精简”)。如果 OP 听从你的建议,他最终会遇到严重的可用性问题。看看现实世界的例子——你知道任何股票报价服务器可以让你使用内容协商来选择感兴趣的领域吗?
【解决方案2】:

第一种情况和第三种情况的优点是一个 url 用于单个资源,而查询字符串用于请求该资源的特定视图。在它们之间进行选择是个人喜好问题,但我倾向于默认获取所有数据并保存用于查看子集的选项。

【讨论】:

  • 好点,但我的同事付钱给你回答这个问题吗? :D 我关心真正的 REST 设计。我的意思是有关于那个的规范吗?
  • 规范 ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm 没有专门解决查询字符串。通常,共享数据应位于相同的基本 url,以便 post/put/delete 将使两个视图的缓存无效。此外,查询字符串往往用于用户单击 html 表单(即 fullview 或 lightview)的那种东西——它提供“状态转移”或从一个资源到下一个资源的链接。根本原则归结为资源/uri 匹配、缓存和状态之间的链接(传输)。
  • @RaymondHettinger 无论您使用路径段还是查询字符串,您仍然在识别两种不同的资源。但是您是正确的,因为这只是您使用的偏好问题。 REST 在 URI 设计问题上无话可说。
  • 我实现了第二种情况,但我认为你是对的。我也同意 Darrel 的观点,他说 REST 在 URL 格式上无话可说
猜你喜欢
  • 1970-01-01
  • 2018-02-28
  • 2010-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-07
  • 1970-01-01
相关资源
最近更新 更多