如何通过HATEOAS链接访问REST集合的一个元素?

时间:2018-11-10 14:02:25

标签: spring rest hateoas spring-hateoas

我正在尝试使用Java Spring构建RESTful服务的体系结构,并为所有这些构建网关服务。为了实现后者,我需要通过spring-hateoas模块提供与相关资源的链接,为我和我的同事们围绕HATEOAS原理设计的其他服务实现一个客户端。

假设我有一个在localhost上运行的服务,侦听8080端口,该服务通过/resources上的GET操作返回资源集合。例如:

{
  "_embedded" : {
    "resources" : [ {
      "label" : "My first resource!",
      "resourceId" : 3,
      "_links" : {
        "self" : {
          "href" : "http://localhost:8080/resources/3"
        },
        "meals" : {
          "href" : "http://localhost:8080/resources",
          "templated" : true
        }
      }
    }, {
      "label" : "Another resource!",
      "resourceId" : 4,
      "_links" : {
        "self" : {
          "href" : "http://localhost:8080/resources/4"
        },
        "meals" : {
          "href" : "http://localhost:8080/resources",
          "templated" : true
        }
      }
    } ]
  },
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/resources",
      "templated" : true
    }
  }
}

我正在尝试使用HATEOAS客户端(例如Traverson)。我如何仅通过关注HATEOAS链接就可以关注资源元素?到目前为止,我的解决方案是在我的收藏集上添加一个指向item的链接,例如:

"_links" : {
    "self" : {
      "href" : "http://localhost:8080/resources",
      "templated" : true
    },
    "item" : {
      "href" : "http://localhost:8080/resources/{id}",
      "templated" : true
    }
}

因此,我可以直接用Traverson替换模板中的id并遵循结果。但这是一个好习惯吗?我应该采取其他方式吗?

1 个答案:

答案 0 :(得分:1)

简单地说,Traverson旨在查找链接。

在最简单的情况下,每个链接都有一个唯一的名称(rel)。通过向Traverson的rel函数简单地提供follow(...)的名称,它将使用正确的LinkDiscoverer并导航到该rel的相应URI。

这是Hop

由于目标是要像浏览网页上的链接那样浏览API,因此必须定义跳数链。

在您的情况下,这比较复杂,因为您嵌入了多个项目。要求提供self链接并不容易,因为您可以很容易地在根文档上看到三个。

因此Traverson对JSON-Path的支持。如果您选中reference documentation,很容易看到可以提供JSON-Path表达式来帮助选择所需的链接。

只要选定的属性是URI,Traverson就会“跳到”它。

注意:仅使用rels时,可以在follow(...)中提供多个rels作为字符串。在使用其他内容(例如JSON-Path表达式或rel(...))时,请使用一个follow(...) 每跳。值得庆幸的是,这不难理解,您可以将每个跃点放在单独的行上(同样,请参阅参考文档以获取示例)。