当前位置: 首页 > 知识库问答 >
问题:

HATEOAS超媒体的运行时发现?

柴兴修
2023-03-14

共有1个答案

何玉韵
2023-03-14

正如@voicesofunreason所说,在HATEOAS中,URI是可发现的(并且没有文档化),因此可以更改它们。也就是说,除非它们是进入系统的入口点(很酷的URI,唯一可以由客户机硬编码的URI)--如果您希望将来能够改进系统URI结构的其余部分,那么就不应该有太多的入口点。这实际上是REST最有用的特性之一。

对于剩余的非酷URI,它们可以随着时间的推移而更改,您的API文档应该详细说明应该在运行时通过超媒体遍历发现它们。

看看理查森的成熟度模型(第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}")
    }
  }
}
{
    "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),对于项,您可能最清楚它们是一个属性还是另一个endpoint;您甚至可以将它们嵌入到检索组的同一个调用中返回。

这里的优点是客户机只需要知道关系(链接)名称(显然除了资源结构/属性之外),而服务器基本上可以自由地更改关系(和资源)URL。

 类似资料:
  • 我有一个带有ui路由器的AngularJS应用程序,它使用带有超媒体的REST API。一般的想法是让API为其各种调用生成URL,并防止客户机自己构造URL。 还有别的想法吗? 除非我在这方面非常错误,否则我不是在寻找模板化的解决方案,即API返回一个url模板的解决方案,该url模板需要客户机注入参数。关键在于url已经填充了数据,因为有些url比上面提供的示例要复杂得多。

  • 我现在正在读《实践中的Rest》一书。我无法理解以下术语超媒体,超媒体格式,超媒体控件,域应用协议。作者建议需要特定领域的超媒体格式。我很难理解这些。我在谷歌上搜索了这些术语,但没有找到正确的答案。谁能解释一下这些术语,以及为什么我们需要特定于领域的超媒体格式而不是应用程序/XML?

  • 超媒体点击事件的监听 超媒体消息的点击事件包括:点击打开链接url和点击打开app的原生页面;其中点击打开url链接使用setOnHyperUrlListener接口,方法如下: Ntalker.getInstance().setOnHyperUrlListener(new OnHyperUrlListener() { @Override public void OnOpenHyp

  • 我有一个应用程序,可以显示来自互联网的图片和视频。现在我正在实现一个“保存”功能,将图片/视频保存到外部或内部存储器中,无需再次下载。 对于图片,我只是用抓取绘图。我如何用Exoplayer2. x/PlayerView中当前缓冲的视频实现同样的效果?我没有找到一个函数。

  • 当我使用以下命令运行11应用程序时: 遇到以下错误: 根据我的理解,这个异常是我的模块设置有问题,但我不清楚需要更改什么: 向以及哪些? 添加到模块使用的命令 完全不同的东西?

  • /** 是否开启超媒体吸底功能(默认开启) @param enableSnap enableSnap */ [Ntalker ntalker_setEnableSnap:NO];