我正在尝试使用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并遵循结果。但这是一个好习惯吗?我应该采取其他方式吗?
答案 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(...)
每跳。值得庆幸的是,这不难理解,您可以将每个跃点放在单独的行上(同样,请参阅参考文档以获取示例)。