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 项目中找到。