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仓库并运行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"
    }
  }
}

根文档中有两个链接: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://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,这是一个用于从移动设备拍摄照片并在互联网上共享的工具。

获取Spring新闻通讯

通过Spring新闻通讯保持联系

订阅

领先一步

VMware提供培训和认证,以加快您的进步。

了解更多

获取支持

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

了解更多

即将举行的活动

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

查看全部