包含HATEOAS约束的REST客户端实现?
有人知道一个包含(HATEOAS)约束的REST客户机的实现吗 从它的文档记录方式以及Ruby、Java和Python实现的效果来看,它似乎是一个很好的候选者。但到目前为止我还没有找到代码的踪迹包含HATEOAS约束的REST客户端实现?,rest,hateoas,Rest,Hateoas,有人知道一个包含(HATEOAS)约束的REST客户机的实现吗 从它的文档记录方式以及Ruby、Java和Python实现的效果来看,它似乎是一个很好的候选者。但到目前为止我还没有找到代码的踪迹 我在寻找任何东西-即使是部分实现也会有帮助。HATEOAS设计原则(REST也是一组设计原则)意味着每个资源最多应该有一个固定URL 通过“超媒体”链接,可以从该URL动态发现其他相关内容 我刚刚创建了一个wikipedia存根是一个Ruby、Java和C#框架,旨在构建使用HATEOAS的客户端和服务
我在寻找任何东西-即使是部分实现也会有帮助。HATEOAS设计原则(REST也是一组设计原则)意味着每个资源最多应该有一个固定URL 通过“超媒体”链接,可以从该URL动态发现其他相关内容 我刚刚创建了一个wikipedia存根是一个Ruby、Java和C#框架,旨在构建使用HATEOAS的客户端和服务器。我没用过,但看起来确实很有趣 下面是以下示例代码:
同样,我不确定这到底是做什么的,也不确定它在实践中的效果如何,但它看起来确实很有趣。REST HTTP和HATEOAS的问题是,没有通用的方法来指定链接,因此很难跟踪链接,因为它们的结构可能会从一个服务提供商更改到另一个服务提供商。一些人会使用
其他人会使用专有的链接结构,例如
。它不像HTML或atom中定义的链接是标准的一部分
客户端无法知道您的表示中的链接是什么,除非有标准或常规的链接表示,否则它无法知道您的媒体类型。您首先应该查看的是通用web浏览器。这是接受HATEOAS(至少在某种程度上)的客户的标准 这就是超媒体的工作原理。这是如此简单,几乎让人痛苦:
http://pigs-are-cool.org/
- 此时,应用程序(您的浏览体验)位于特定的URI
- 浏览器正在显示该URI的内容
- 此时,应用程序处于不同的URI
- 浏览器正在显示新URI的内容
- 超媒体=带有嵌入链接的HTML页面
- 应用程序状态=您在任何时间点在浏览器中看到的内容
- RSS和提要阅读器。它们遍历用户提供给它们的链接
- 大多数AtomPub博客客户端。他们只需要一个服务文档的URI,就可以从那里找到上传图片、博客文章、搜索等的位置
- 可能是谷歌的小玩意(和类似的),但它们仅仅是不同外观的浏览器
- 网络爬虫也是RESTful客户,但它们是一个利基市场
- 客户机与任何服务器一起工作,因为它使用一些URI进行了初始化,并且服务器以预期结果进行响应(例如,对于atom博客客户机,atom服务文档)
- 客户机除了在运行时可以找到什么以外,对服务器如何设计其URI一无所知
- 客户机知道足够的媒体类型和链接关系来理解服务器在说什么(例如Atom或RSS)
- 客户端使用嵌入式链接查找其他资源;有些是自动的(如
),有些是手动的(比如
好问题。我还没有发现编写REST式客户端的框架:即那些能够按照HATEOAS原则动态反应的框架。这是一个遗憾,因为这种想法是REST的宗旨,但是缺乏正式的支持以及对REST的误解使社区看起来支离破碎。@Dawiderenchy由于与此处相同的原因,此处不属于主题。请避免推荐您不熟悉的网站。推荐阅读:我认为这个答案和您的Wikipedia存根是不正确的。我不明白REST应用程序必须通过单个简单URL访问的方式或原因。任何给定的URL都应该是可书签的(很酷的URI不会更改)我不知道“最多一个固定URL”有道理。这意味着有些资源没有URL?显然没有。我也不明白为什么一个资源不能有多个URI。HATEOAS意味着状态转换是通过超媒体链接完成的。这包括从某个深度书签备份到某个父资源。HATEOS原则实际上是一个re URI不是固定的,这就是重点。将客户端url假设与服务器的实际实现分离。这一切都很好,但web浏览器只是呈现超媒体,这是一个人做的所有理解和决定链接的含义和单击的内容。那么设计为由软件驱动的客户端实现呢?这绝对是最大的区别。由软件驱动的客户端实现需要编程以理解它在“冒险”中发现的链接(和形式?)。我想主要的一点是,将客户端编码为媒体类型,而不是特定服务器的URI结构。有趣的是,您所有的“其他示例”都是检索数据并将其呈现给用户阅读的客户端。HATEOS在服务器上以逻辑格式公开内容非常有效,但在客户端,我看不出它有什么作用在RPC上,我就这样结束了
Order order = new Order(); // place the order order = service("http://www.caelum.com.br/order").post(order); // cancels it resource(order).getTransition("cancel").execute();