1. 概述

本文将解释Spring Data REST的基础知识,并展示如何使用它构建简单的 REST API。

一般来说,Spring Data REST 构建在 Spring Data 项目之上,可以轻松构建连接到 Spring Data 存储库的超媒体驱动的 REST Web 服务 - 所有这些都使用 HAL 作为驱动超媒体类型。

它消除了通常与此类任务相关的大量手动工作,并使 Web 应用程序的基本 CRUD 功能的实现变得非常简单。

2.Maven依赖

我们的简单应用程序需要以下 Maven 依赖项:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId
    <artifactId>spring-boot-starter-data-rest</artifactId></dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
</dependency>

我们决定在本示例中使用 Spring Boot,但经典 Spring 也可以正常工作。我们还选择使用 H2 嵌入式数据库以避免任何额外的设置,但该示例可以应用于任何数据库。

3. 编写应用程序

我们将首先编写一个域对象来代表我们网站的用户:

@Entity
public class WebsiteUser {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    private String name;
    private String email;

    // standard getters and setters
}

每个用户都有一个姓名和一个电子邮件,以及一个自动生成的 ID。现在我们可以编写一个简单的存储库:

@RepositoryRestResource(collectionResourceRel = "users", path = "users")
public interface UserRepository extends PagingAndSortingRepository<WebsiteUser, Long> {
    List<WebsiteUser> findByName(@Param("name") String name);
}

这是一个允许您使用 WebsiteUser 对象执行各种操作的接口。我们还定义了一个自定义查询,它将根据给定名称提供用户列表。

@RepositoryRestResource 注释是可选的,用于自定义 REST 端点。如果我们决定省略它,Spring 将自动在“ /websiteUsers ”而不是“ /users ”处创建端点。

最后,我们将编写一个标准的 Spring Boot 主类来初始化应用程序

@SpringBootApplication
public class SpringDataRestApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringDataRestApplication.class, args);
    }
}

就是这样!我们现在拥有功能齐全的 REST API。让我们看看它的实际效果。

4. 访问 REST API

如果我们运行应用程序并在浏览器中访问http://localhost:8080/ ,我们将收到以下 JSON:

{
  "_links" : {
    "users" : {
      "href" : "http://localhost:8080/users{?page,size,sort}",
      "templated" : true
    },
    "profile" : {
      "href" : "http://localhost:8080/profile"
    }
  }
}

正如您所看到的,有一个“ /users ”端点可用,并且它已经具有“ ?page ”、“ ?size ”和“ ?sort ”选项。

还有一个标准的“ /profile ”端点,它提供应用程序元数据。值得注意的是,响应的结构方式遵循 REST 架构风格的约束。具体来说,它提供了统一的接口和自描述消息。这意味着每条消息都包含足够的信息来描述如何处理该消息。

我们的应用程序中还没有用户,因此访问http://localhost:8080/users只会显示一个空的用户列表。让我们使用curl来添加用户。

$ curl -i -X POST -H "Content-Type:application/json" -d '{  "name" : "Test", \ 
"email" : "[email protected]" }' http://localhost:8080/users
{
  "name" : "test",
  "email" : "[email protected]",
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/users/1"
    },
    "websiteUser" : {
      "href" : "http://localhost:8080/users/1"
    }
  }
}

我们还看一下响应头:

HTTP/1.1 201 Created
Server: Apache-Coyote/1.1
Location: http://localhost:8080/users/1
Content-Type: application/hal+json;charset=UTF-8
Transfer-Encoding: chunked

您会注意到返回的内容类型是“ application/hal+json ”。 HAL是一种简单的格式,为 API 中的资源之间的超链接提供了一致且简单的方法。标头还自动包含 Location 标头,这是我们可以用来访问新创建的用户的地址。

我们现在可以通过http://localhost:8080/users/1访问该用户

{
  "name" : "test",
  "email" : "[email protected]",
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/users/1"
    },
    "websiteUser" : {
      "href" : "http://localhost:8080/users/1"
    }
  }
}

您还可以使用curl 或任何其他REST 客户端发出PUT、PATCH 和DELETE 请求。还需要注意的是,Spring Data REST 自动遵循 HATEOAS 的原则。 HATEOAS是 REST 架构风格的限制之一,这意味着应该使用超文本来通过 API 找到路径。

最后,让我们尝试访问我们之前编写的自定义查询并查找名为“test”的所有用户。这是通过访问http://localhost:8080/users/search/findByName?name=test来完成的

{
  "_embedded" : {
    "users" : [ {
      "name" : "test",
      "email" : "[email protected]",
      "_links" : {
        "self" : {
          "href" : "http://localhost:8080/users/1"
        },
        "websiteUser" : {
          "href" : "http://localhost:8080/users/1"
        }
      }
    } ]
  },
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/users/search/findByName?name=test"
    }
  }
}

5. 结论

本教程演示了使用 Spring Data REST 创建简单 REST API 的基础知识。本文中使用的示例可以在链接的GitHub 项目中找到。