繁体   English   中英

HATEOAS超媒体的运行时发现?

[英]Runtime discovery of HATEOAS hypermedia?

我了解HATEOAS通过发送应用程序在该时间点响应时可以执行的所有操作(HAL,JSON-LD等)来表示应用程序状态。

例如,查看银行的帐户资源可能使您可以存入,提取或关闭帐户(可能返回UPDATE和DELETE动词的选项)。

就这些链接的运行时可发现性(通过使用方的客户端)而言,该怎么办?

如果发送这些链接的目的是使客户端与服务器脱钩,并通过响应中的超媒体来驱动状态,则开发人员必须在应用程序中进行一定程度的编码,以使响应有意义。回来。

我了解发送OPTIONS请求是确定资源当前状态以及下一步可以做什么的方式,但是为了发现要使用的实际URI,将这些简单地硬编码为COOL URI吗?

就像@VoicesOfUnreason所说的那样,在HATEOAS中URI是可发现的(没有记录),因此可以更改它们。 也就是说,除非它们是您系统的最切入点( Cool URI ,这是唯一可以由客户端进行硬编码的URI ),并且如果您想要扩展其余部分的功能,则不应有太多将来您系统的URI结构。 实际上,这是REST最有用的功能之一。

对于其余的非Cool URI,可以随时间更改它们,并且您的API文档应阐明以下事实:应在运行时通过超媒体遍历发现它们。

查看Richardson的成熟度模型(第3级) ,这就是链接起作用的地方。 例如,从顶层(例如/ api / version(/ 1))开始,您会发现有一个指向组的链接。 这是在HAL Browser之类的工具中的外观:

根:

{
  "_links": {
    "self": {
      "href": "/api/root"
    },
    "api:group-add": {
      "href": "http://apiname:port/api/group"
    },
    "api:group-search": {
      "href": "http://apiname:port/api/group?pageNumber={pageNumber}&pageSize={pageSize}&sort={sort}"
    },
    "api:group-by-id": {
      "href": "http://apiname:port/api/group/id" (OR "href": "http://apiname:port/api/group?id={id}")
    }
  }
}

添加将只是对该端点的POST,然后您将具有2个GET方法。

GET /api/group?pageNumber=0&pageSize=20&sort=asc

可能会返回如下内容:

{
    "groups": [
      {
        "id": 123,
        "name": "Test Group"
      }, 
      {
        "id": 134,
        "name": "Tennis squad"
      }
    ]
}

然后,当您深入到特定组时(例如#123):

{
  "Id" : 123,
  "Name" : "test",
  "_links": {
    "self": {
      "href": "/api/group/1" (OR "/api/group?id=1")
    },
    "edit": {
      "href": "http://apiname:port/api/group/1"
    },
    "api:delete": {
      "href": "http://apiname:port/api/group/1"
    },
    "api:items-query": {
      "href": "http://apiname:port/api/bonus?groupId=1"
    }
  }
}

在这里,编辑只是一个PUT,然后您需要一个DELETE(在同一链接中查看REST的2级),因为对于这些项,您可能最清楚它们是一个属性还是另一个端点。 您甚至可以将它们嵌入以便在检索组的同一调用中返回。

这样做的好处是,客户端只需要知道关系(链接)名称(显然,除了资源结构/属性之外),而服务器则几乎可以自由更改关系(和资源)URL。

尝试创建表达力强,可发现的超媒体方面有很多现有技术。 您可能需要查看:

我在想,也许是一系列的if语句,它们检查某些属性以确定状态,或者甚至切换语句。 这是正确的路径-还是有更好的超媒体发现手段?

我目前的想法是,您希望按照谈判和遵守协议的方式来塑造您的想法; 因此,请考虑使用状态机而不是if语句。

对于初学者,请查看如何喝杯咖啡

RESTBucks提供的文档中的超链接旨在帮助客户协商RESTBucks协议; 客户端已经了解协议已纳入模型的假设。 换句话说,客户已经知道,通过协商协议可以使其达到目标

当然,可以有多个服务于同一目标的协议。 例如,RESTBucks还可以支持“ Give Away Day Old Coffee”协议。 宣布每个项目的存在后,客户将被期望选择哪个是目标的更好表达,并遵循该路径。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM