RESTful API,全称为Representational State Transfer(表述性状态转移)的API,是现代Web服务中最为流行的架构风格之一。其核心思想是将网络中的资源抽象为一系列URL,客户端通过HTTP协议对这些URL进行访问和操作,从而实现资源的获取、创建、更新和删除等操作。
Spring MVC注解是Spring框架中用于简化Web层开发的一种机制。这些注解允许开发者以声明式的方式定义控制器的行为、处理请求参数、绑定请求数据以及指定响应格式等。
作用:该注解是@Controller和@ResponseBody的组合(作用于类上),用于标识一个类是RESTful风格的控制器类。它的作用是将Controller类的所有方法返回的对象转换为JSON或XML格式的响应体,而不是跳转到View。
@Controller:用于标识一个类作为控制器(Controller),,负责处理 HTTP 请求并返回响应。
@ResponseBody:用来指示方法的返回值应该直接作为HTTP响应正文(Body)返回给客户端,而不是被解析为视图名或模板名。
搭配:通常与@RequestMapping(或其子注解如@GetMapping、@PostMapping等)搭配使用,以定义处理HTTP请求的方法。
@RestController
@RequestMapping("/api")
public class MyController {
}
作用:@RequestMapping是一个通用的映射注解,用于标识方法或类在何种请求下进行处理(一般与@RestController一起作用于类上)。其子注解分别对应HTTP协议中的GET、POST、PUT、DELETE、PATCH方法,用于实现资源的查询、增加、更新、删除和局部更新操作。
@RestController
@RequestMapping("/api")
public class MyController {}
@GetMapping、@DeleteMapping与@PathVariable(获取路径参数)以实现基于URL路径的查询操作。路径变量通常是必需的,因为它们在URL中指定了资源的唯一标识。
//@PathVariable与@GetMapping的组合使用
// 从URL路径中提取ID,查询对应数据
@GetMapping("/users/{id}")
public String getUserById(@PathVariable("id") Long userId) {}
//@PathVariable与@DeleteMapping的组合使用
// 从URL路径中提取ID,删除用户
@DeleteMapping("/users/{id}")
public String deleteUserById(@PathVariable("id") Long userId) {}
@GetMapping与@RequestParam(获取查询参数)搭配使用,以实现基于查询参数的查询操作。
// 处理搜索请求的控制器方法
@GetMapping("/search")
public String search(@RequestParam String keyword, @RequestParam(defaultValue = "1") int page) {}
//@RequestParam(defaultValue = "1") int page为page参数指定了默认值1
//当在@RequestParam注解中设置required=true(默认值)时,对应的查询参数是必需的。
@PostMapping与@RequestBody(将请求体内容绑定到方法参数上)搭配使用,以处理POST请求中的JSON或XML数据。在处理POST、PUT和PATCH请求时,如果方法参数使用了@RequestBody注解,并且该参数是控制器方法所必需的,则请求体中必须包含相应的JSON或XML数据。并且前段需要设置了正确的 Content-Type
头部请求体位JSON(application/json)
@PostMapping("/users")
public ResponseEntity createUser(@RequestBody User user) {}
//@RequestBody 通常与数据绑定和验证一起使用。你可以在 User 类上使用注解(如 @NotNull, @Size 等)来定义验证规则,Spring MVC 会在反序列化数据后自动进行验证。
如果需要在GET、PUT、Delete请求中使用对象接收参数,可以使用@ModelAttribute注解。它也可以用于PUT和DELETE请求。
//与 @GetMapping 搭配使用
//通常,@GetMapping 用于读取数据,而不是修改数据,因此 @ModelAttribute 在 @GetMapping 方法中不常用于绑定请求体(因为 GET 请求没有请求体)。然而,@ModelAttribute 可以用于方法级别,以准备模型属性供视图层使用。
@Controller
public class UserController {
// 使用 @ModelAttribute 准备模型属性
@ModelAttribute("allUsers")
public List populateUsers() {
// 假设这里是从数据库获取用户列表
return Arrays.asList(new User("john"), new User("jane"));
}
// @GetMapping 方法使用 @ModelAttribute 准备的属性
@GetMapping("/users")
public String listUsers(Model model) {
// "allUsers" 属性已经由上面的 @ModelAttribute 方法添加到模型中
return "userList"; // 返回视图名
}
}
//在这个例子中,populateUsers 方法使用 @ModelAttribute 注解,它的返回值会被添加到每个请求处理的模型中,包括 /users GET 请求的处理。
//与 @PutMapping 搭配使用
//@PutMapping 通常用于更新资源。当与 @ModelAttribute 搭配使用时,@ModelAttribute 可以用于方法参数上,以将请求参数绑定到模型对象上。
@PutMapping("/users/{id}")
public ResponseEntity updateUser(@PathVariable Long id, @ModelAttribute User userDetails) {
// 假设这里是从数据库获取用户,并根据 userDetails 更新用户信息
User updatedUser = userService.updateUser(id, userDetails);
return ResponseEntity.ok(updatedUser);
}
//在这个例子中,客户端发送一个 PUT 请求到 /users/{id},请求体中包含要更新的用户信息。Spring MVC 会自动将请求体中的 JSON(或其他格式)数据反序列化为 User 对象,并将其作为 userDetails 参数传递给 updateUser 方法。