首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

使用 Spring HATEOAS 开发 REST 服务(4)

使用 Spring HATEOAS 开发 REST 服务(4)

超媒体控制与 HAL在添加了链接之后,服务器端提供的表达可以帮助客户端更好的发现服务器端所支持的动作。在具体的表达中,应用虽然可以根据需要选择最适合的格式,但是在表达的基本结构上应该遵循一定的规范,这样可以保证最大程度的适用性。这个基本结构主要是整体的组织方式和链接的格式。HAL(Hypertxt Application Language)是一个被广泛采用的超文本表达的规范。应用可以考虑遵循该规范,Spring HATEOAS 提供了对 HAL 的支持。
HAL 规范HAL 规范本身是很简单的,  给出了示例的 JSON 格式的表达。
清单 16. HAL 规范的示例 JSON 格式的表达
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
{
"_links": {
"self": {
"href": "http://localhost:8080/lists"
}
},
"_embedded": {
"lists": [
{
"id": 1,
"name": "Default",
"_links": {
"todo:items": {
"href": "http://localhost:8080/lists/1/items"
},
"self": {
"href": "http://localhost:8080/lists/1"
},
"curies": [
{
"href": "http://www.midgetontoes.com/todolist/rels/{rel}",
"name": "todo",
"templated": true
}
]
}
}
]
}
}




HAL 规范围绕资源和链接这两个简单的概念展开。资源的表达中包含链接、嵌套的资源和状态。资源的状态是该资源本身所包含的数据。链接则包含其指向的目标(URI)、所表示的关系和其他可选的相关属性。对应到 JSON 格式中,资源的链接包含在_links 属性对应的哈希对象中。该_links 哈希对象中的键(key)是链接的关系,而值(value)则是另外一个包含了 href 等其他链接属性的对象或对象数组。当前资源中所包含的嵌套资源由_embeded 属性来表示,其值是一个包含了其他资源的哈希对象。
链接的关系不仅是区分不同链接的标识符,同样也是指向相关文档的 URL。文档用来告诉客户端如何对该链接所指向的资源进行操作。当开发人员获取到了资源的表达之后,可以通过查看链接指向的文档来了解如何操作该资源。
使用 URL 作为链接的关系带来的问题是 URL 作为属性名称来说显得过长,而且不同关系的 URL 的大部分内容是重复的。为了解决这个问题,可以使用 Curie。简单来说,Curie 可以作为链接关系 URL 的模板。链接的关系声明时使用 Curie 的名称作为前缀,不用提供完整的 URL。应用中声明的 Curie 出现在_links 属性中。代码中定义了 URI 模板为“http://www.midgetontoes.com/todolist/rels/{rel}”的名为 todo 的 Curie。在使用了 Curie 之后,名为 items 的链接关系变成了包含前缀的“todo:items”的形式。这就表示该链接的关系实际上是“http://www.midgetontoes.com/todolist/rels/items”。
Spring HATEOAS 的 HAL 支持目前 Spring HATEOAS 仅支持 HAL 一种超媒体表达格式,只需要在应用的配置类上添加“@EnableHypermediaSupport(type= {HypermediaType.HAL})”注解就可以启用该超媒体支持。在启用了超媒体支持之后,服务器端输出的表达格式会遵循 HAL 规范。另外,启用超媒体支持会默认启用“@EnableEntityLinks”。在启用超媒体支持之后,应用需要进行相关的定制使得生成的 HAL 表达更加友好。
首先是内嵌资源在_embedded 对应的哈希对象中的属性值,该属性值是由 org.springframework.hateoas.RelProvider 接口的实现来提供的。对于应用来说,只需要在内嵌资源对应的模型类中添加 org.springframework.hateoas.core.Relation 注解即可,如  所示。
清单 17. 在模型类中添加 @Relation 注解
1
2
3
@Relation(value = "list", collectionRelation = "lists")
public class List extends AbstractEntity {
}




  中声明了当模型类 List 的对象作为内嵌资源时,单个资源使用 list 作为属性值,多个资源使用 lists 作为属性值。
如果需要添加 Curie,则提供 org.springframework.hateoas.hal.CurieProvider 接口的实现,如  所示。利用已有的 org.springframework.hateoas.hal.DefaultCurieProvider 类并提供 Curie 的前缀和 URI 模板即可。
清单 18. 添加 CurieProvider 接口的实现
1
2
3
4
5
@Bean
public CurieProvider curieProvider() {
return new DefaultCurieProvider("todo",
new UriTemplate("http://www.midgetontoes.com/todolist/rels/{rel}"));
}




结束语在开发一个新的 Web 服务或 API 时,REST 架构风格已经成为事实上的标准。在开发时需要明白 REST 架构风格中所包含的约束的含义。HATEOAS 作为 REST 服务约束中最复杂的一个,目前还没有得到广泛的使用。但是采用 HATEOAS 所带来的好处是很大的,可以帮助客户端和服务器更好的解耦,可以减少很多潜在的问题。Spring HATEOAS 在 Spring MVC 框架的基础上,允许开发人员通过简单的配置来添加 HATEOAS 约束。如果应用本身已经使用了 Spring MVC,则同时启用 HATEOAS 是一个很好的选择。本文对 REST 和 HATEOAS 的相关概念以及 Spring HATEOAS 框架的使用做了详细的介绍。
返回列表