问题标签 [hateoas]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
web-services - 如何在用于 GUI 应用程序的 HATEOAS API 中处理全局超媒体?
编辑:为了澄清,这个问题涉及在 HATEOAS APIs 上构建 GUI 应用程序,如何设计基于超媒体“可发现性”(即动态)原则的界面,特别是处理避免“链接”回“home”的纯“模态”GUI " 表示应该“始终开启”的全局功能(由超媒体入口 API 点表示)。
在严格的 REST API 实现中,利用超媒体作为应用程序状态引擎 (HATEOAS),使用哪些模式(如果有)来指示/表示全局“始终有效”的操作(如果这样的概念甚至真的存在于 REST 中)?
元问题是,你能完全“排除”重复的超媒体吗?
通过简化示例,假设我们有一个/version
资源Allow: OPTIONS HEAD GET
。该资源不依赖任何东西,并且永远不会受到其他地方可能发生的任何状态转换的影响。
是否要求
/version
超媒体与每个其他资源请求一起简单地发送?或者另一种模式,客户端行为链接回
Home
(可能缓存)然后触发我们始终有效的/version
调用?(GUI 术语中的“模态”模式 - 关闭此资源,返回首页,然后继续)或者是否有某种方法/模式可以为任何给定的应用程序创建独立的解耦模块?(也许是某种命名空间?)
在一个复杂但松耦合的 API 中,选项 1最终被埋在超媒体地狱中,每次资源调用都会重复 80-95% 的有效负载。这似乎“正确”但太讨厌了。选项 2 会导致 GUI 客户端行为出现奇怪的怪癖(隐藏有效元素,直到您“回家” - 模态类型操作)或 GUI 客户端硬编码它“知道”的带外操作的许多不平静的假设总是有效的。
选项 3 与我最初的问题有关:是否有一个标志或其他模式来指示可以发送一次(例如使用根/主资源)然后从后续响应中“排除”的全局有效操作?
rest - REST/HATEOAS:模板化restul链接是一种可接受的方法
我正在为我们正在寻求开发的 API 调查整个 Layer3/HATEOS/RESTful/HAL。
我们将公开可能被所有这些链接膨胀的数据列表。将链接模板化不是一个想法,这会被称为什么?我似乎找不到任何提及它,如果这不是一个好方法,为什么?
以一个假设的假期搜索 API 为例,入口点可以提供目的地和出发机场的列表,允许用户使用其中一个开始搜索。
像下面这样的方法会是更有效的方法吗?(松散地基于 HAL)如果不是,为什么?
}
javascript - 使用角度的基本 HATEOAS - 加载入口点
我正在尝试对 HATEOAS 风格的 REST-api 进行干净的实现。我的服务器端看起来有点像这样(在伪 HTTP 和伪 JSON 中):
返回(具有正确的 Content-Type 和所有爵士乐):
因此,它是应用程序的单一入口点(_links
符合HAL)。任何类型的客户都会GET /api-entry-point
并且知道在哪里可以找到用户或从那里订购资源。典型的事情是登录,然后检索用户列表。
对于我的 Angular 应用程序,这意味着获取这些链接是第一件事。我使用了一个自定义服务(基于$http
),它返回一个进行 HTTP 调用的承诺。这个承诺需要在应用程序启动时解决一次。我如何确保使用角度发生这种情况?
我已经查看了resolve
属性 (on $routeProvider
),但是让每条路线都依赖于/api-entry-point
.
我也检查过module.run
- 但它也没有解决承诺。
我该如何解决这个问题?有没有办法或者我需要不同的方法/框架?
json - 应该如何为 RESTful JSON 集合实现 HATEOAS 样式的链接?
为了简单起见并避免命名冲突,我一直在像这样在我的记录资源中捆绑链接......
但是,我无法弄清楚如何在集合中实现链接。我花了很长时间在网上搜索示例,除了使用不太精简的HAL之外,我无法解决我的问题。
这意味着我必须将数组包装在一个容器对象中。
但是它与单一资源不同,所以我要让记录表现得像集合一样,并将其包装在一个容器中......
从表面上看,这似乎是一个非常巧妙的解决方案。生成的 JSON 更深一层,但 HATEOAS 已经实现,所以没问题吧?一点也不。当我回到收藏品时,真正的刺痛来了。现在单个资源已经被包装在一个容器中以便与集合保持一致,现在必须更改集合以反映更改。这就是它变得丑陋的地方。十分难看。现在集合看起来像这样......
是否有更简单的解决方案来为集合实施 HATEOAS?或者我应该和 HATEOAS 告别,因为它迫使我过度复杂化数据结构?
rest - 如何使用 ServiceStack 将 href 转换为 RequestDto?
我正在构建一个支持链接资源扩展的 ReST API,但我不知道如何使用 ServiceStack 的本机绑定功能将 URL 转换为填充的“请求 DTO”对象。
例如,假设我的 API 允许您使用此请求检索有关乐队的信息:
如果你想扩大乐队的专辑列表,你可以这样做:
我正在使用 ServiceStack,我想通过重用现有的服务方法来执行这个内联扩展。
我的 ServiceStack 响应 DTO 如下所示:
我的 ServiceStack 请求/路由对象是这样的:
处理请求的实际服务是这样的:
在上面的示例中,假设我将字符串计算/bands/123/albums
为 Van Halen 专辑列表的 HREF。
我现在如何使用 ServiceStack 的内置绑定功能将字符串/bands/123/albums
转换为可以直接传递给 BandAlbumService 的 BandAlbums“请求”对象,取回填充的 BandAlbumsDto 对象并将其包含在我的响应对象中?
(是的,我知道这可能不是最小化数据库命中的最佳方法。我稍后会担心。)
ruby-on-rails-3 - 如何在 Rails 中实现 HATEOAS
我从 ActiveResource 开始,但很快就碰壁了。在底层模型上覆盖 to_json 和 to_xml 时无法使 ActiveResource 工作。另外,无法使资源表示将链接注入到生成的 xml 文档中。哦,顺便说一句,我使用的是 Rails 3.2.1。
我做了一些研究,发现了它的宝石。试过了,由于某种原因对我不起作用。所以我的问题是:
如果我有一个资源(比如书籍)托管在一个网站(例如http://books.org)中,另一个资源(比如学生,http://students.org)托管在另一个网站上,怎么能我得到书来向学生展示自己的 HATEOS 荣耀?
我能够让图书资源以 XML 文档的形式呈现给提问的学生。我通过在学生网站中使用 vanilla Rails ActiveResource 来做到这一点。我创建了继承自ActiveResource::Base
. 然后我指定了self.site
and self.element_name
,之后我能够对远程图书站点执行一些基本的 ActiveRecord 式查询。唯一对我有用的是Book.all
and Book.find(1)
。即使这样也不令人满意,因为该表示包含所有数据库列,我想至少删除其中的一些列,但事实证明这是不可能的。
现在我已经放弃了这种方法,我想知道 Rails 中是否有一个工作示例可以构建更复杂的资源(即书籍)表示,其中包含将驱动应用程序状态传输的链接?我发现这样一个简单的要求在 Rails 中实现起来如此困难,这简直令人难以置信。我要做的只是创建一个资源的表示,其中将包含一些链接,这些链接将指导消费者发现该资源的功能。我最感兴趣的是实现工作流,这是一个分层的、剥洋葱类型的发现对话过程。
rest - 使用 REST 和 HATEOS 的非上下文操作
我正在尝试为酒店预订实施基于 HATEOS 的 REST 服务,但有这样的困惑:
1)除了WADL,客户端如何知道可能的操作及其对应的URI。当客户端点击 REST 服务的根目录时,我是否应该将所有可能的操作和 URI 作为响应?
2)当客户获得一个地区所有住宿选择的列表时,我将返回他询问的地区所有酒店的列表。响应包含:
但是我在这里的查询是客户将如何了解其他相关的可能操作,例如按价格排序的列表?
json - 用于更改资源状态的 Rest uri 设计
我有一个可以通过 URI 访问的资源,/resources/{resource_identifier}
并且它有一个我希望可以访问的“状态”属性。我为此想到了几个选项,哪个是“最好的”或“最完整的”?
选项一将操作附加到 URI 并将客户端POST
添加到这些 URI
不过这看起来很笨拙。
选项二在 URI 中使用查询参数并让客户端PATCH
访问这些
选项三使用请求的有效负载并拥有客户端PUT
有效载荷选项:
或者也许完全是别的东西?
rest - 生成 HATEOAS 客户端库
假设我有一个 RESTful API 用于管理使用HAL来促进 HATEOAS 的订单:
我想使用一组接口来编写我的客户端(应用程序),这样,假设这些接口的实现是 DI-d/由 DI-d 工厂等构建的,我真的(想要)不必关心他们得到了我的 RESTful API 的支持。例如(伪 C#/Java):
我的问题是:我/从 API生成Order
/接口的实现是否有意义?Item
我的意思是与导出 WSDL 的 C#/web 服务提供的方式类似。
我一直在考虑实现OPTIONS
诸如/orders
和之类的资源,/orders/{id}
这样我就可以有效地拥有一个 HATEOAS API 来遍历 API 的模式:
当然,我可以_links
使用任何给定的资源(/orders/2
例如)返回对象的这一部分,但这会排除静态代码生成。
我想知道是否有一种明智的方法来封装这样一个事实,即如果提供了特定链接,则相关操作应该可用/执行,否则不可用。
注意:如果重要的话,我实际上是在使用 JavaScript(特别是使用 AngularJS)。但是,我仍然想使用一组概念接口/合同来编写我的应用程序。
java - Spring Data REST - 无法延迟加载集合
我刚刚开始在我们的 Spring MVC 应用程序中使用 Spring Data REST,以减少为我们的 API 提供 REST HATEOAS 支持所需的工作。
这对顶级实体几乎立即起作用——我们可以返回所有项目、PUT/POST 新项目或按 ID 返回特定项目。
我现在遇到的问题是当尝试按照提供的链接显示映射到我返回的实体的集合时。
我有一个“org.hibernate.LazyInitializationException: no Session”被抛出 - 我假设它会将父对象遍历到集合中(这是延迟加载的)。
谷歌搜索该问题建议启用 OpenEntityManagerInViewFilter - 但是我们不愿意为我们的项目启用此功能,因为我们之前有过糟糕的经历,这会导致数据库连接死锁。
任何人都可以提供关于我可能缺少的配置选项的提示,或者我在文档中缺少的内容,以便让这些链接正确导航集合。
问候,
安迪