13

我目前正在开发 REST 服务。该服务有一个实体,它有不同的版本,类似于维基百科的文章。

现在我想知道如果我应该返回什么

GET /article/4711

我是否应该使用(临时)重定向到当前版本,例如

GET /article/4711/version/7

还是应该直接返回当前版本?使用重定向将大大简化 HTTP 缓存(使用 Last-Modified),但具有重定向的缺点(额外请求,“更难”实现)。因此,我不确定这是否是一种好习惯。

有什么建议、建议或经验可以分享吗?

(顺便说一句:曾经尝试过搜索“REST 版本”吗?你得到的一切都是关于 API 的版本而不是实体。所以如果这是重复的,请多多包涵。)

4

5 回答 5

11

如果您将版本视为实体(从外观上看是这样),这就是我的建议:

GET /article/4711

返回所有版本的列表(以及指向它们的链接)。这构成/article/4711了一个容器实体。

GET /article/4711/latest

返回最新版本的内容。您可能需要考虑/version/latest与以下内容保持一致。

GET /article/4711/version/7

返回文章的特定版本。

于 2010-04-02T16:47:04.560 回答
2

取决于您对GET /article/4711. 如果它打算始终指向最新版本,那么它应该直接返回最新版本。重定向到特定版本似乎有问题,因为您依赖用户/客户端库将来不会访问该特定 URL。为了翻译成 HTML 术语,用户可能会为version/7URL 添加书签,并惊讶于他们现在访问的是旧版本,而不是他们最初在地址栏中键入的最新版本。

于 2010-04-02T16:42:59.373 回答
2

文章版本和超文本

如果您真的关心使接口成为 RESTful,那么您应该考虑如何以HATEOS样式执行此操作。

在我看来,这意味着返回足够的信息,使用户能够浏览您的实体的修订列表。如果你从罗伊那里读到这...

“不需要发现接口。它在超文本中定义。表示告诉客户端如何组合所有转换到下一个应用程序状态”

...你会感觉到你GET /article/4711应该如何返回足够的信息

  1. 获取文章的最新版本

  2. 获取下一个/以前的版本

您会知道什么最适合您的模型,但作为指针,您可以考虑使用标签

  <link rel="older"
        type="text/html"
        href="http://www.yourdomain.com/article/4711?version=6"/>

...

于 2010-04-06T14:25:10.750 回答
2

您可能想查看https://datatracker.ietf.org/doc/html/draft-brown-versioning-link-relations

使用 CMIS 链接关系和 HTTP 链接标头,您可以使 /article/4711 成为最新版本并提供版本链接,例如链接:</article/4711/versions>;rel=version-history

于 2010-04-02T19:53:19.693 回答
1

我认为返回以下修订列表会更安心:

GET /article/4711

您还可以拥有:

GET /article/4711/current

直接返回当前版本。

于 2010-04-02T16:40:55.367 回答