Spring Data REST 现在支持 ALPS 元数据

工程 | Greg L. Turnquist | 2014 年 7 月 14 日 | ...

随着 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"
    }
  }
}

在根文档中有两个链接:todosprofile。客户端可能不知道 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 描述符形式的结果。

  • Create 和 patch 是不安全的,因为它们会改变系统状态。
  • Delete 和 update 是幂等的,这意味着我们可以多次执行相同的操作并期望得到相同的结果。

每个操作的名称也告诉我们在哪里执行该操作。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,这是一个用于从您的移动设备拍照并通过互联网共享的工具。

获取 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

领先一步

VMware 提供培训和认证,助您加速进步。

了解更多

获得支持

Tanzu Spring 提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件,只需一份简单的订阅。

了解更多

即将举行的活动

查看 Spring 社区所有即将举行的活动。

查看所有