Spring Data REST 现在支持 ALPS 元数据

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

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

在根文档中有两个链接: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" : "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 描述符形式的结果,如顶部所示。

  • 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: 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,这是一种用于从你的移动设备拍摄照片并通过互联网分享的工具。

获取 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

更上一层楼

VMware 提供培训和认证,以加速你的进步。

了解更多

获得支持

Tanzu Spring 在一个简单的订阅中提供对 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

即将举行的活动

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

查看所有