领先一步
VMware提供培训和认证,以加快您的进步。
了解更多随着最近发布的Spring Data的Evans M1里程碑,Spring Data REST现在支持ALPS元数据来描述导出资源的语义。
ALPS是一种用于定义应用程序级语义简单描述的数据格式,其复杂性类似于HTML微格式。它还支持将元数据添加到现有媒体类型。从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://127.0.0.1:8080/todos"
},
"profile" : {
"href" : "https://127.0.0.1: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://127.0.0.1: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-todos
,看看我们能发现什么。
{ "id" : "get-todos",
"name" : "todos",
"type" : "SAFE",
"rt" : "#todo-representation"
}
此操作描述了一个GET请求。它将todos
命名为它所涉及的rel(我们在本文开头看到过)。它是安全的,表示它不会改变系统的状态。这意味着如果我们对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://127.0.0.1:8080/todos/1
Content-Length: 0
Date: Mon, 14 Jul 2014 20:23:12 GMT
在响应头中,我们可以看到新的位置:https://127.0.0.1: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://127.0.0.1:8080/todos/1"
}
}
}
使用ALPS元数据,我们能够创建一个新的TODO然后查找它。
我们能够了解可用的操作以及由它管理的元素。我们也不必知道URI结构。元数据告诉我们应该在哪里查找以执行这些RESTful转换。这意味着服务器可以更改URI,而不会影响我们与服务交互的能力。
如果您有兴趣了解Spring Data REST的更多实际应用,请务必注册参加今年的SpringOne大会上的数据与超媒体。Spring Mobile/Android项目负责人Roy Clarkson将与我一起使用Spring Data REST创建Spring-a-Gram,这是一个用于从移动设备拍摄照片并在互联网上共享的工具。