在 Spring 项目里实现对 Restful API 的支持,可借助 Spring 的 Spring Web MVC 或 Spring WebFlux 模块。下面分别对这两种方式进行介绍。
使用 Spring Web MVC 实现 Restful API
1. 添加依赖
若使用 Maven 项目,需在 pom.xml
中添加 spring-boot-starter-web
依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
2. 创建实体类
创建用于表示资源的实体类,例如创建一个 User
类:
public class User {
private Long id;
private String name;
private String email;
// 构造函数、Getter 和 Setter 方法
public User() {}
public User(Long id, String name, String email) {
this.id = id;
this.name = name;
this.email = email;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
3. 创建控制器
创建一个控制器类,使用 @RestController
注解标记该类,同时使用不同的注解(如 @GetMapping
、@PostMapping
等)来处理不同的 HTTP 请求:
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
@RestController
@RequestMapping("/users")
public class UserController {
private List<User> users = new ArrayList<>();
// 获取所有用户
@GetMapping
public List<User> getAllUsers() {
return users;
}
// 根据 ID 获取用户
@GetMapping("/{id}")
public User getUserById(@PathVariable Long id) {
return users.stream()
.filter(user -> user.getId().equals(id))
.findFirst()
.orElse(null);
}
// 创建新用户
@PostMapping
public User createUser(@RequestBody User user) {
users.add(user);
return user;
}
// 更新用户信息
@PutMapping("/{id}")
public User updateUser(@PathVariable Long id, @RequestBody User updatedUser) {
for (int i = 0; i < users.size(); i++) {
User user = users.get(i);
if (user.getId().equals(id)) {
users.set(i, updatedUser);
return updatedUser;
}
}
return null;
}
// 删除用户
@DeleteMapping("/{id}")
public void deleteUser(@PathVariable Long id) {
users.removeIf(user -> user.getId().equals(id));
}
}
4. 启动 Spring Boot 应用
创建一个主应用类,使用 @SpringBootApplication
注解标记该类,并启动 Spring Boot 应用:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class RestfulApiApplication {
public static void main(String[] args) {
SpringApplication.run(RestfulApiApplication.class, args);
}
}
使用 Spring WebFlux 实现 Restful API
1. 添加依赖
若使用 Maven 项目,需在 pom.xml
中添加 spring-boot-starter-webflux
依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
2. 创建实体类
与 Spring Web MVC 中的实体类相同,这里依旧使用 User
类。
3. 创建处理器
创建一个处理器类,处理不同的 HTTP 请求:
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.server.ServerRequest;
import org.springframework.web.reactive.function.server.ServerResponse;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import java.util.ArrayList;
import java.util.List;
@Component
public class UserHandler {
private List<User> users = new ArrayList<>();
// 获取所有用户
public Mono<ServerResponse> getAllUsers(ServerRequest request) {
Flux<User> userFlux = Flux.fromIterable(users);
return ServerResponse.ok()
.contentType(MediaType.APPLICATION_JSON)
.body(userFlux, User.class);
}
// 根据 ID 获取用户
public Mono<ServerResponse> getUserById(ServerRequest request) {
Long id = Long.parseLong(request.pathVariable("id"));
Mono<User> userMono = Mono.justOrEmpty(users.stream()
.filter(user -> user.getId().equals(id))
.findFirst());
return userMono.flatMap(user -> ServerResponse.ok()
.contentType(MediaType.APPLICATION_JSON)
.bodyValue(user))
.switchIfEmpty(ServerResponse.notFound().build());
}
// 创建新用户
public Mono<ServerResponse> createUser(ServerRequest request) {
Mono<User> userMono = request.bodyToMono(User.class);
return userMono.flatMap(user -> {
users.add(user);
return ServerResponse.ok()
.contentType(MediaType.APPLICATION_JSON)
.bodyValue(user);
});
}
// 更新用户信息
public Mono<ServerResponse> updateUser(ServerRequest request) {
Long id = Long.parseLong(request.pathVariable("id"));
Mono<User> updatedUserMono = request.bodyToMono(User.class);
return updatedUserMono.flatMap(updatedUser -> {
for (int i = 0; i < users.size(); i++) {
User user = users.get(i);
if (user.getId().equals(id)) {
users.set(i, updatedUser);
return ServerResponse.ok()
.contentType(MediaType.APPLICATION_JSON)
.bodyValue(updatedUser);
}
}
return ServerResponse.notFound().build();
});
}
// 删除用户
public Mono<ServerResponse> deleteUser(ServerRequest request) {
Long id = Long.parseLong(request.pathVariable("id"));
users.removeIf(user -> user.getId().equals(id));
return ServerResponse.noContent().build();
}
}
4. 配置路由
创建一个路由配置类,配置不同的路由规则:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.reactive.function.server.RouterFunction;
import org.springframework.web.reactive.function.server.RouterFunctions;
import org.springframework.web.reactive.function.server.ServerResponse;
import static org.springframework.web.reactive.function.server.RequestPredicates.*;
@Configuration
public class UserRouter {
@Bean
public RouterFunction<ServerResponse> route(UserHandler userHandler) {
return RouterFunctions
.route(GET("/users"), userHandler::getAllUsers)
.andRoute(GET("/users/{id}"), userHandler::getUserById)
.andRoute(POST("/users"), userHandler::createUser)
.andRoute(PUT("/users/{id}"), userHandler::updateUser)
.andRoute(DELETE("/users/{id}"), userHandler::deleteUser);
}
}
5. 启动 Spring Boot 应用
创建一个主应用类,使用 @SpringBootApplication
注解标记该类,并启动 Spring Boot 应用:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class RestfulApiWebFluxApplication {
public static void main(String[] args) {
SpringApplication.run(RestfulApiWebFluxApplication.class, args);
}
}
总结
- Spring Web MVC:适合传统的同步阻塞式应用,使用注解的方式配置控制器和处理请求,简单直观。
- Spring WebFlux:适合构建响应式、非阻塞的应用,使用函数式编程的方式配置路由和处理请求,能提升应用的性能和吞吐量。