问题标签 [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.
json - 我应该如何处理 JSON 中的 HATEOAS 链接和引用?
我正在设计一个 REST api 并尽可能地 RESTful。我想将HATEOAS合并到 json 响应中。
将 URL 添加到相关资源很容易,但对用于这些链接的结构进行了一些讨论。
我发现很多文章都使用了从ATOM提要中借用的结构:
这提出了一些问题:
为什么使用数组作为容器?根据我认识的一位 javascript 开发人员的说法,将链接作为对象的属性访问链接会更容易。例如:
/li>是否有一个通用的 json 结构(除了再次适应 atom)来描述资源属性中的引用吗?(例如消息的发送者)。
引用可能应该再次解析为 url,但是包含简单 id 会很糟糕吗?有一些像:
/li>
我的想法是,虽然 HATEOAS 使客户不需要很多知识来使用 API,但我有点不愿意消除使用这些知识的可能性(比如通过构建链接来访问个人资料图片客户端而不首先查找用户)。
http - HTTP 选项 - 不可缓存?
我正在设计一个尽可能符合 HATEOAS 原则的 RESTful 服务。因此,我需要一种方法让我的酷 URL 返回描述可用选项的链接列表。我正在使用 HAL-JSON 来简化数据格式,所以这一切都很好,但我现在正在考虑应该使用哪种 HTTP 方法来实现这一点。
我确信我可以坚持使用简单的 GET,但通过阅读 HTTP RFC,似乎 OPTIONS 可能适合这里的账单。我唯一担心的是粗体:
9.2 选项
OPTIONS 方法表示请求有关在由 Request-URI 标识的请求/响应链上可用的通信选项的信息的请求。此方法允许客户端确定与资源相关联的选项和/或要求,或服务器的能力,而无需暗示资源操作或启动资源检索。
对此方法的响应不可缓存。
在网络标准方面有更多经验的人可以解释为什么会这样吗?在我看来,您肯定希望客户端至少在短时间内缓存此结果,因为在完全 HATEOAS 系统中,此调用可能会非常频繁地进行,以遍历 rel 链接以到达您正在查找的操作为了。
我也喜欢关于使用 OPTIONS 与简单的 GET 从一个很酷的 URL 检索操作的一些意见。
rest - HATEOAS - 发现和 URI 模板
我正在为我公司的内部数据设计一个 HATEOAS API,但在发现链接时遇到了麻烦。考虑以下一组步骤,让某人在此系统中检索有关特定员工的信息:
- 用户发送 GET 以
http://coredata/
获取所有可用资源,返回多个链接,包括一个标记为 rel = "http://coredata/rels/employees
" - 用户在第一个请求的 rel 上遵循 HREF,在(例如)执行 GET
http://coredata/employees
最后一次通话返回的数据是我的难题,也是我听到不同建议的情况。这里是其中的一些:
- 该 GET 将返回所有员工(可能带有截断的数据),并且客户端将负责从该列表中选择所需的员工。
该 GET 将返回许多 URI 模板链接,描述如何查询/获取一名员工/获取所有员工。就像是:
我有点卡在这里最接近 HATEOAS 的东西。对于选项 1,我真的不想让我的客户每次都为了导航而检索所有员工,但我可以看到在示例 2 中使用 URI 模板如何引入一些带外知识。
我的另一个想法是使用 RetrieveOne、Query 和 All 操作作为我的酷 URL,但这似乎违反了您应该能够从一个基本 URI 导航到所需资源的概念。
有没有其他人设法想出一个很好的方法来处理这个问题?一旦您检索到一个资源或一组资源,导航就变得非常简单,但它似乎很难用于发现。
http - HATEOAS Rel - 还有标准吗?
我刚刚开始为我目前正在构建的 WebAPI 编写客户端实现。API 已经使用了 HATEOAS,所以我正在相应地编写客户端。我使用RestSharp作为客户端的基础。
客户端在构建时(“ https://myapi/start ”)传递了 api 基本 URL,它会在该 URL 处触发请求,然后传递一组用于其他可用资源的 uri - 授权(“ https://myapi/ authorize ") 并请求访问令牌 (" https://myapi/tokens ") 以授权它调用 api 上的安全资源。
问题是对于返回的超媒体中的 rel="" 要求是否制定了任何标准?
json - 带有表单和链接的 JSON 超媒体 API
我正处于规划 REST api 的早期阶段,我希望它遵守 REST 的 HATEOAS 约束。但我也想提供 JSON 格式。所以我的问题是是否有约定可以在 JSON 中表示链接和表单。
我找到了链接的示例,看起来这是表示链接的一种非常常见的方式:
另一方面,表示形式并不是我见过的很多东西。我在想也许有人坐下来想出了一些类似的东西,但考虑了所有的警告:
对此的灵感来自观看此视频,Jon Moore 认为 JSON 不是超媒体 api 的好格式:
http://oredev.org/2010/sessions/hypermedia-apis
顺便说一句真的很好!
感谢所有输入!
rest - 完全 RESTful(包括 HATEOAS)客户端能否在客户端状态下存储服务器提供的 URI?
(注意:我假设一个 REST 服务使用 URI 来识别资源,我知道这并不是 REST 的严格限制)
根据我对 HATEOAS 的理解,客户端不应该对服务提供的 URI 结构进行任何假设,除了初始入口点(而应该只使用服务器以结构化方式提供给它的 URI)。这是否意味着客户端只能使用最新请求提供给它的 URI,或者客户端可以跟踪从同一会话的早期请求中收到的 URI?如果是前者,后者会违反哪个 REST 约束?
跟踪 URI 的两个示例:
- 在照片查看应用程序中,我遍历照片列表,将一些照片的 URI 保存到列表中。然后,我导航到“马赛克”功能并将所有照片从保存的 URI 加载到马赛克中。
- 我浏览产品列表并将一些产品添加到我的客户端购物车中。完成后,我在 Orders 资源中创建一个新元素,其中产品按其 URI 指定的顺序排列。
rest - 用于变异实体的 RESTful URL
前段时间我开发了一个网络应用程序来许可我们的软件。这有客户、帐户、用户和许可证。许可证分配给用户并使用序列号激活。许可证是作为处理采购订单的输出而创建的,即没有任何直接发布新许可证的方法。
我目前正在阅读“RESTful Web Services”并考虑如何使其成为 RESTful(HATEOAS 也是)。
大多数 URL 我都清楚,但是许可证需要一些有趣的操作。许可证的基本 URL 将是/licence/{licenceID}
.
- 为用户分配可用许可证(由支持人员完成)
- 释放用户的许可证(将其放回可用许可证池中)
- 使用序列号激活许可证,并生成密钥作为回报
- 重新激活许可证
- 将许可证续订到新的到期日期
- 禁用许可证:仅单向,不可撤销。许可证仍然存在
现在,在 REST 中,我只能使用标准方法,并且不能在 URL 中嵌入“分配”操作。我在想的是挑选出我想要影响的许可证部分。这给出了: -
- 列表:
GET /licences/
- 得到:
GET /licences/{licenceID}
- 分配:
POST /licences/{licenceID}/assignee/{userID}
- 发布:
DELETE /licences/{licenceID}/assignee
- 启用:
POST /licences/{licenceID}/serialNumber/{serialNumber}
- 停用:
DELETE /licences/{licenceID}/serialNumber
- 更新:
POST /licences/{licenceID}/expires
- 禁用:
DELETE /licences/{licenceID}/enabled
我的问题是: -
- 这个 URL 方案是“正确”或明智的做法吗?
- 或者我应该有一个“许可证分配”和“许可证激活”的集合(例如
/assignments/{licenceId}/{userId}
:)
- 或者我应该有一个“许可证分配”和“许可证激活”的集合(例如
- 我是否遗漏了一些基本的东西(当我读完这本书时可能会清楚)
- 参数(userId 和 serialNumber)应该作为路径参数还是查询参数?
- {userId} 指代系统上的用户,因此可以是路径参数
- {serialNumber} 是在客户端(Java Swing)上根据自己的信息生成的(没有序列号的中央数据库)。
非常感谢!
json - API 设计:HATEOAS、json、版本控制和媒体类型
我喜欢 REST HATEOAS 的概念,即通过超链接让您的 API 可被发现。人们喜欢使用 ATOM 格式的 XML 链接,您甚至可能不需要对 API 进行版本控制。但是,我只在做 JSON,我想对我的 API 进行版本控制并且仍然做 HATEOAS。
似乎最好的做法是使用供应商媒体类型,application/vnd.me.v1+json
但所有这些都在讨论 JSON 中的超链接没有格式,以及 HAL、JSON+Colleton 和 Siren 等具有自己的媒体类型的东西。
所以,这是我的困惑。首先,为什么要通过媒体类型指定格式?为什么在 JSON 中包含链接不能只是客户遵循的约定?hm-json 浏览器不就是这样发现链接的吗?
而且,如果必须将其定义为媒体类型,那么这样的事情是否有效?
任何人?
rest - 自链接在超媒体 API 中的重要性是什么?
我在 REST 上阅读的所有文章和书籍都重复了将“自我”相关链接添加到您的超媒体响应的重要性,但它们都对原因和用例有所了解。
为什么要添加自我链接,它有什么用处?
jax-rs - 为什么注入的 UriInfo 使用与注入的 HttpServletRequest 不同的主机名?
我正在学习 JAX-RS,并且喜欢在响应中将 URL 返回到其他相关操作的想法。使用 Apache TomEE JAX-RS 1.5.1,由于某种原因,注入UriInfo
实例提供的 URL 始终使用“localhost”作为主机名。
我添加了一个@Context HttpServletRequest
,getLocalName
和getServerName
值都匹配公共主机名。因此,与 TomEE 捆绑的 CXF-RS 运行时应该可以使用此信息。只是不清楚为什么它没有被使用。
下面是测试类和示例输出。如何让 TomEE 的嵌入式 CXF-RS 使用正确的主机名?或者,如果这不是正确的方法,我应该如何构建可以在 JAX-RS 响应中返回的 URL?
这是输出: