17

Does anybody know of an implementation of a REST client that embraces the constraint of Hypermedia as the Engine of Application State (HATEOAS)?

The Sun Cloud API seems to be a good candidate, judging from the way it's documented and a statement by the author to the effect that Ruby, Java, and Python implementations were in the works. But so far I've found no trace of the code.

I'm looking for anything - even a partial implementation would be helpful.

4

5 回答 5

12

您应该首先查看的是常见的网络浏览器。它是接受 HATEOAS 的客户的标准(至少在某种程度上)。

这就是超媒体的工作方式。它是如此简单,几乎是痛苦的:

  1. 您将浏览器指向http://pigs-are-cool.org/
  2. 浏览器加载 HTML 页面、图像、CSS 等。
    • 此时,应用程序(您的浏览体验)位于特定的 URI。
    • 浏览器正在显示该 URI 的内容
  3. 您会在应用程序中看到一个链接
  4. 你点击链接
  5. 浏览器跟随链接
    • 此时,应用程序位于不同的 URI
    • 浏览器正在显示新 URI 的内容

现在简要解释这两个术语与 Web 浏览体验的关系:

  • 超媒体 = 带有嵌入链接的 HTML 页面
  • 应用程序状态 = 您在任何时间点在浏览器中看到的内容。

因此,HATEOAS 实际上描述了当您从一个网页转到另一个网页时在 Web 浏览器中发生的情况:

带有嵌入式链接的 HTML 页面可以随时驱动您在浏览器中看到的内容

HATEOAS 一词只是这种浏览体验的抽象。

RESTful 客户端应用程序的其他示例包括:

  • RSS 和 Feed 阅读器。他们遍历用户给他们的链接
  • 大多数 AtomPub 博客客户端。他们只需要一个服务文档的 URI,然后他们就可以从那里找到上传图片和博客文章、搜索等的地方。
  • 可能是谷歌小工具(和类似的),但它们只是不同皮肤的浏览器。
  • Web 爬虫也是 RESTful 客户端,但它们是一个小众市场。

RESTful 客户端软件的一些特点:

  • 客户端可以与任何服务器一起工作,前提是它使用了一些 URI 并且服务器以预期的结果进行响应(例如,对于 atom 博客客户端,Atom 服务文档)。
  • 客户端不知道服务器如何设计它的 URI,只知道它在运行时可以找到什么
  • 客户端知道足够的媒体类型和链接关系来理解服务器在说什么(例如 Atom 或 RSS)
  • 客户端使用嵌入式链接查找其他资源;一些自动(如<img src=)一些手动(如<a href=)。

它们通常由用户驱动,可以正确地称为“用户代理”,但 GoogleBot 除外。

于 2010-07-09T12:38:46.153 回答
6

Restfulie是一个 Ruby、Java 和 C# 框架,旨在支持构建使用 HATEOAS 的客户端和服务器。我没用过,但看起来很有趣。

这是他们的 java 项目中的一些示例代码:

Order order = new Order();

// place the order
order = service("http://www.caelum.com.br/order").post(order);

// cancels it
resource(order).getTransition("cancel").execute();

同样,我不确定这是做什么的,或者它在实践中的效果如何,但它看起来确实很有趣。

于 2010-02-19T18:38:45.923 回答
2

REST HTTP 和 HATEOAS 的问题在于没有通用的方法来指定链接,因此很难跟踪链接,因为它们的结构可能会从一个服务提供者变为另一个。有些人会使用<link href="..." />其他人会使用专有结构的链接ex。<book href="..." />. 它不像在 HTML 或 atom 中链接是标准定义的一部分。

客户无法知道您的表示中的链接是什么,除非有链接的标准或常规表示,否则它不知道您的媒体类型

于 2010-06-10T12:11:27.110 回答
1

HATEOAS 设计原则(REST 也是一组设计原则)意味着每个资源最多应该有一个固定的 URL。

其他所有相关的内容都应该可以通过“超媒体”链接从该 URL 动态发现。

我刚刚在这里创建了一个维基百科存根

于 2009-07-25T07:47:19.733 回答
1

与此同时,还有 Spring HATEOAS 项目。它还有一个客户端实现: https ://docs.spring.io/spring-hateoas/docs/current/reference/html/#client

Map<String, Object> parameters = new HashMap<>();
parameters.put("user", 27);

Traverson traverson = new Traverson(URI.create("http://localhost:8080/api/"), MediaTypes.HAL_JSON);
String name = traverson
    .follow("movies", "movie", "actor").withTemplateParameters(parameters)
    .toObject("$.name");
于 2021-08-27T14:31:23.997 回答