更上一层楼
VMware 提供培训和认证,以加速你的进步。
了解更多随着 Spring Data 的 Evans M1 里程碑的最新发布,Spring Data REST 现在支持 ALPS 元数据来描述导出资源的语义。
ALPS 是一种用于定义应用程序级别语义的简单描述的数据格式,其复杂性类似于 HTML 微格式。它还支持将其元数据添加到现有媒体类型。 从 2.2 M1 版本开始,Spring Data REST 公开基于 JSON 的 ALPS 资源,可以帮助我们导航其资源。 让我们看看如何操作!
我们可以从一个快速示例开始。 如果你克隆 TODO repo 并运行 mvn spring-boot:run
,你可以导航它以轻松了解其值。
$ curl -i localhost:8080
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
X-Application-Context: application
Content-Type: application/hal+json
Transfer-Encoding: chunked
Date: Thu, 17 Jul 2014 13:36:48 GMT
{ "_links" : {
"todos" : {
"href" : "http://localhost:8080/todos"
},
"profile" : {
"href" : "http://localhost:8080/alps"
}
}
}
在根文档中有两个链接:todos
和 profile
。 客户端可能不知道 todos
的含义,但 profile 中包含的内容有明确的定义。 它基本上指向一个资源,该资源描述了资源语义,超出实际媒体类型(在本例中为 HAL)的定义。 为什么我们不去看看?
$ curl -i localhost:8080/alps
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
X-Application-Context: application
Content-Type: application/alps+json
Transfer-Encoding: chunked
Date: Thu, 17 Jul 2014 13:54:56 GMT
{ "version" : "1.0",
"descriptors" : [ {
"href" : "http://localhost:8080/alps/todos",
"name" : "todos"
} ]
}
这里我们有一个 application/alps+json
文档。 根据此文档,它包含有关 todos
的信息,该信息与我们之前看到的 todos
一一对应。 因此,让我们导航到它的 href。
$ curl localhost:8080/alps/todos
{ "version" : "1.0",
"descriptors" : [ {
"id" : "todo-representation",
"descriptors" : [ {
"name" : "description",
"doc" : {
"value" : "Details about the TODO item",
"format" : "TEXT"
},
"type" : "SEMANTIC"
}, {
"name" : "title",
"doc" : {
"value" : "Title for the TODO item",
"format" : "TEXT"
},
"type" : "SEMANTIC"
}, {
"name" : "id",
"type" : "SEMANTIC"
}, {
"name" : "completed",
"doc" : {
"value" : "Is it completed?",
"format" : "TEXT"
},
"type" : "SEMANTIC"
} ]
}, {
"id" : "get-todos",
"name" : "todos",
"type" : "SAFE",
"rt" : "#todo-representation"
}, {
"id" : "create-todos",
"name" : "todos",
"type" : "UNSAFE",
"rt" : "#todo-representation"
}, {
"id" : "delete-todo",
"name" : "todo",
"type" : "IDEMPOTENT",
"rt" : "#todo-representation"
}, {
"id" : "update-todo",
"name" : "todo",
"type" : "IDEMPOTENT",
"rt" : "#todo-representation"
}, {
"id" : "patch-todo",
"name" : "todo",
"type" : "UNSAFE",
"rt" : "#todo-representation"
}, {
"id" : "get-todo",
"name" : "todo",
"type" : "SAFE",
"rt" : "#todo-representation"
} ]
}
该文档包含一个顶级描述符 todo-representation
。 此描述符是描述符的集合,每个描述符对应域对象的每个属性。 每个域元素都为我们提供其名称和额外的文档信息。 我们使用 POJO 中的 @Description
注释为其提供了一个文本值,但该数据也可以由资源包提供。
ALPS 文档的更下方是此 TODO 资源支持的所有 RESTful 转换:get、create、delete、update 和 patch。 现在我们正在取得进展!
让我们看一下 get-todos
,看看我们能弄清楚什么
{ "id" : "get-todos",
"name" : "todos",
"type" : "SAFE",
"rt" : "#todo-representation"
}
此操作描述了一个 GET。 它将 todos
命名为它相关的 rel(我们在本文开头看到过)。 它是 SAFE 的,表明它不会改变系统的状态。 这意味着如果我们对 todos
执行 GET 操作,我们可以期望响应包含 todo-representation
描述符形式的结果,如顶部所示。
每个操作的名称还告诉我们应该在哪里执行操作。 todos
表示应该针对集合资源执行的 RESTful 操作,而 todo
用于项目资源。
有了这些信息,我们可以看到如何与 todos
交互。 我们将从创建一个新的 TODO 开始。 查看 create-todos
{ "id" : "create-todos",
"name" : "todos",
"type" : "UNSAFE",
"rt" : "#todo-representation"
}
它告诉我们寻找 todos
。 因此,获取顶部显示的 URI 并将其与 POST(创建的 REST 动词)结合起来,我们可以这样写
$ curl -i -X POST -H "Content-Type:application/json" -d '
{ "title":"Create blog entry",
"description": "Write blog post about SDRs ALPS metadata support",
"completed": "false"
}' localhost:8080/todos
HTTP/1.1 201 Created
Server: Apache-Coyote/1.1
X-Application-Context: application
Location: http://localhost:8080/todos/1
Content-Length: 0
Date: Mon, 14 Jul 2014 20:23:12 GMT
在响应标头中,我们可以看到新的位置:http://localhost:8080/todos/1。
ALPS 元数据还将 get-todo
列为另一个操作,它将返回 todo-representation
。 让我们试试看
$ curl localhost:8080/todos/1
{ "title" : "Create blog entry",
"description" : "Write blog post about SDRs ALPS metadata support",
"completed" : false,
"_links" : {
"self" : {
"href" : "http://localhost:8080/todos/1"
}
}
}
使用 ALPS 元数据,我们能够创建一个新的 TODO,然后查找它。
我们能够了解哪些操作可用以及它管理哪些元素。 而且我们也不必知道 URI 结构。 元数据告诉我们应该在哪里查找以进行这些 RESTful 转换。 这意味着服务器可以更改 URI,而不会影响我们与服务交互的能力。
如果你有兴趣了解更多 Spring Data REST 的实际应用,请务必注册今年 SpringOne 会议上的 Data Meets Hypermedia。 Spring Mobile/Android 项目负责人 Roy Clarkson 将与我一起使用 Spring Data REST 创建 Spring-a-Gram,这是一种用于从你的移动设备拍摄照片并通过互联网分享的工具。