领先一步
VMware 提供培训和认证,助您加速进步。
了解更多随着 Spring Data Evans M1 里程碑的最新发布,Spring Data REST 现在支持 ALPS 元数据,用于描述导出的资源的语义。
ALPS 是一种数据格式,用于定义应用程序级别语义的简单描述,其复杂性与 HTML micro-formats 类似。它还支持将其元数据添加到现有的媒体类型。从 2.2 M1 版本开始,Spring Data REST 会公开基于 JSON 的 ALPS 资源,这些资源可以帮助我们导航其资源。让我们通过一个例子来看看!
我们可以从一个快速的例子开始。如果你克隆了 TODO 仓库 并运行 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" : "https://:8080/todos"
},
"profile" : {
"href" : "https://: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" : "https://: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: https://:8080/todos/1
Content-Length: 0
Date: Mon, 14 Jul 2014 20:23:12 GMT
在响应头中,我们可以看到新的位置:https://: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" : "https://: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,这是一个用于从您的移动设备拍照并通过互联网共享的工具。