问题标签 [hypermedia]
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.
rest - REST 和 HATEOAS:属性中的链接
我目前正在开发一个 API,它试图通过在 API 响应中包含指向相关资源的链接来做一些 HATEOAS。
在某些地方,我已经(ab?)使用链接来获取文章图片之类的内容。因此,例如,文章资源可能如下所示:
如您所见,我已将文章图像的链接添加到links
哈希中。当时的想法是:这是一个 URL,所以它可能应该去那里。然而,人们也可以争辩说文章图像是文章的一个属性。
所以,我的问题是: 在 REST 社区中是否有任何商定的准则来处理如何判断 URL 是超媒体链接还是属性?两种方法的优点/缺点是什么?
rest - 确定 REST 服务的起点资源
我正在为迷宫游戏创建一个 ASP.Net Web API 服务。
- 用户应获取迷宫中的所有单元格详细信息,以在 2D 平面中可视化迷宫。我正在使用 get 方法实现这一点
public List<Cell> Get()
- 用户应该通过将 CellID 作为输入来获取单元格的详细信息。我正在使用 get 方法实现这一点
public CellRepresentation Get(string id)
。请注意,CellRepresentation 用于使用WebApi.Hal返回超媒体链接。这些链接代表可能移动的目标单元格,如上、下、左和右。
现在,我需要一种方法来向用户传达启动游戏的起始单元格。[在下面的迷宫中,单元格“10”是起点]。发送此消息的基于 REST 的方式是什么?
控制器
HAL 相关类
商务舱
迷宫
asp.net-web-api - WebApi.HAL 集合表示问题
我为迷宫游戏服务创建了 Web API 项目。它使用WebApi.Hal来返回hal+json
和hal+xml
媒体类型。它在大多数情况下都有效——除了以下问题。
- 虽然 page 在请求中是 2,但它返回所有页面的所有单元格。如何纠正它?
- 在 hal+json 中,除了嵌入的单元格之外,还有指向自身中所有单元格的“链接”。在 hal+xml 中,只有嵌入的单元格。为什么有区别?哪个是对的?
有一个链接添加为
rel="page" href="~/api/cells/page/{page}"
。尽管我已经编写了以下代码,但为什么会rel
以“页面”的形式出现`public static Link GetCells { get { return new Link("cell","~/api/cells/page/{page}"); } }
- searchTerm 添加了一个链接。如何在客户端使用它?我找不到任何有用的例子。
- 所有的细胞都是嵌入的。是正确的
HAL
收藏方式吗?还是应该是链接?
请求:http://localhost:51910/api/cells/page/2
应用程序/hal+xml
应用程序/hal+json
控制器
表示和链接
商务舱
asp.net-web-api - 如何在 HAL 中获取链接资源的关联名称
我正在为项目任务创建 API。它有一个TasksController,如下所示。我正在使用WebApi.Halhal+json
生成超媒体,并且 该服务hal+xml
media types
也支持。
以下是我目前对 GET 请求http://localhost:51910/api/tasks/1的响应。在响应中有一个优先级链接列表——但它们在响应中没有关联的名称(在 UI 中显示——比如Low
、Medium
、High
等)。
使用 WebApi.HAL 获取优先级名称的最佳 HAL 方法是什么?
注意:未来可以增强优先级列表。
优先
控制器
HAL 生成相关类
angularjs - AngularJS 与超媒体 (HATEOAS):如何跨州使用超媒体 url
我有一个带有ui 路由器的AngularJS应用程序,它使用带有Hypermedia的REST API。总体思路是让 API 为其各种调用生成 url,并阻止客户端自己构建 url。
例如,在获取产品列表时,API 返回的内容如下:
所以,问题是:我想导航到产品的细节。我有来自集合超媒体的 API url。但是,在更改状态时,我需要以某种方式将此 url 传递给详细状态,以便详细状态的控制器可以获取产品。
UI url 与 API url 完全解耦,即客户端有自己的 url 方案。
实现这一目标的最佳方法是什么,同时保持客户端无状态并且每个页面都可以添加书签?
一种解决方案是通过ui router
'data
属性传递 url。但是,该页面不能添加书签。另一种方法是在 UI url 中传递 API url,这将使页面保持可收藏(只要 API url 不变),但 UI url 会非常难看。
还有其他想法吗?
除非我对此非常错误,否则我不是在寻找模板化解决方案,即 API 返回需要由客户端注入参数的 url 模板的解决方案。关键是 url 已经填充了数据,因为某些 url 比上面提供的示例要复杂得多。
rest - HATEOAS 超媒体的运行时发现?
我理解 HATEOAS 通过发送所有可以在应用程序内执行的操作作为响应(HAL、JSON-LD 等)来表示应用程序状态。
例如,查看银行的账户资源可能允许您存款、取款或关闭账户(可能返回 UPDATE 和 DELETE 动词的选项)。
就这些链接的运行时可发现性(由消费客户端)而言,如何处理呢?
如果发送这些链接的目的是将客户端与服务器解耦并通过响应中的超媒体驱动状态,则开发人员必须在应用程序中硬编码一定数量的知识才能理解响应的含义回来。
我理解发送 OPTIONS 请求是确定资源当前状态以及下一步可以做什么的方法,但是为了发现要使用的实际 URI - 这些是否会简单地硬编码为 COOL URI?
ruby-on-rails - 带有 active_model_serializers 的条件链接
我正在尝试在 rails 中创建一个超媒体 api。我想使用 json_api 适配器使用 active_model_serializers 序列化我的有效负载。但是有条件地序列化链接似乎并不简单。
这是一种博客应用程序,用户可以在其中关注其他用户。因此,当我序列化一个用户资源时,比如对于 UserA,如果 current_user 没有关注 UserA,我想要一个带有 rel :follow 的链接,如果 current_user 已经关注 UserA,我想要一个带有 rel :unfollow 的链接。在创建超媒体 API 时,这似乎是一个极其微不足道的用例。有谁知道是否有任何使用 active_model_serializers 的好方法?
我目前写了这样的东西(并将其包含在所有序列化程序中):
它确实有效。但就是感觉不对。如果将来对 active_model_serializers 的更改给我搞砸了,我也不会感到惊讶。
rest - HATEOAS 和链接/操作
我正试图围绕如何(以及是否)在我的 api 中实现 HATEOAS。我喜欢只为客户提供适合当前情况的操作的概念之一。但是我不确定我是否正确地实施了这个想法。
假设我有一个可以更改状态的资源类型订单,它可以有不同的状态(处理、接受、拒绝、过期、成功)。然后我应该创建以下 json 对象:
还是我在这里创建了不必要的操作?如果上面是正确的,状态应该由 PATCH 还是 GET 来改变?如果是 PATCH,怎么会知道(违背超媒体的目的)?
编辑:忘记添加订单ID
c# - 在 c# webapi 中创建超媒体的正确方法
我正在研究如何为特定资源实现超媒体,但找不到真正的实现示例,只是抽象......
你知道,在各种文章中,这个家伙创建了一个方法,比如:
到目前为止我所拥有的:
和约会类:
有正确的方法吗?我的意思是,没有硬编码链接?如何为给定类型动态创建它们,即约会类?
我使用的是 c# Webapi,而不是 c# MVC。
asp.net-web-api2 - 如何在 ASP.NET Web API 2 OData v4 响应中包含 selfLink 和 navigationLink?
我想在我的 JSON 响应中包含 selfLink 和 navigationLink(s),如下所示:
我注意到存在以下方法:
- builder.EntitySet("实体").HasFeedSelfLink(...)
- LinkGenerationHelpers.GenerateSelfLink(..)
但我不知道如何使用它们,或者即使我应该使用它?
更新: 我发现可以在 HTTP 标头中添加Accept: application/json;odata.metadata=full 。这会给我@odata.navigationLink、@odata.id(我对selfLink 的意思)和一大堆其他@odata 元数据。这让我想到了两个新问题:
- 是否可以将默认值更改为 odata-metadata=full 服务器端?
- 是否可以添加自定义元数据格式,只允许我输出其中一些 @odata 元数据,如果可能的话,更改其中一些的名称?