3.7、Controller层实现
分类: 搭建单体商城服务
Controller 层实现
Controller 层是表现层,负责接收 HTTP 请求,调用 Service 层处理业务逻辑,返回响应结果。本节将学习如何实现 Controller 层。
本节将学习:RESTful API 设计、请求参数处理、响应结果封装,以及异常处理。
RESTful API 设计
RESTful 设计原则
RESTful API 设计原则:
- 资源导向:URL 表示资源,不是动作
- HTTP 方法:使用 GET、POST、PUT、DELETE 表示操作
- 状态码:使用 HTTP 状态码表示结果
- 无状态:每个请求都是独立的
RESTful API 示例
RESTful API 设计:
GET /api/users:查询用户列表GET /api/users/{id}:查询用户详情POST /api/users:创建用户PUT /api/users/{id}:更新用户DELETE /api/users/{id}:删除用户
请求参数处理
@PathVariable
@PathVariable 用于获取路径变量。
@GetMapping("/users/{id}") public User getUser(@PathVariable Long id) { return userService.getById(id); }
@RequestParam
@RequestParam 用于获取查询参数。
@GetMapping("/users") public Page<User> listUsers( @RequestParam(defaultValue = "1") Integer current, @RequestParam(defaultValue = "10") Integer size, @RequestParam(required = false) String keyword ) { Page<User> page = new Page<>(current, size); return userService.page(page); }
@RequestBody
@RequestBody 用于获取请求体(JSON)。
@PostMapping("/users") public User createUser(@RequestBody User user) { return userService.register(user); }
响应结果封装
Result 封装类
package com.example.ecommerce.common; import lombok.Data; @Data public class Result<T> { private Integer code; private String message; private T data; public static <T> Result<T> success(T data) { Result<T> result = new Result<>(); result.setCode(200); result.setMessage("Success"); result.setData(data); return result; } public static <T> Result<T> success() { return success(null); } public static <T> Result<T> error(Integer code, String message) { Result<T> result = new Result<>(); result.setCode(code); result.setMessage(message); return result; } public static <T> Result<T> error(String message) { return error(500, message); } }
Controller 使用 Result
@RestController @RequestMapping("/api/users") public class UserController { @Autowired private UserService userService; @GetMapping("/{id}") public Result<User> getUser(@PathVariable Long id) { User user = userService.getById(id); return Result.success(user); } @PostMapping public Result<User> createUser(@RequestBody User user) { User created = userService.register(user); return Result.success(created); } }
异常处理
自定义异常
package com.example.ecommerce.exception; public class BusinessException extends RuntimeException { private Integer code; public BusinessException(String message) { super(message); this.code = 500; } public BusinessException(Integer code, String message) { super(message); this.code = code; } public Integer getCode() { return code; } }
全局异常处理
package com.example.ecommerce.exception; import com.example.ecommerce.common.Result; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; @RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(BusinessException.class) public Result<?> handleBusinessException(BusinessException e) { return Result.error(e.getCode(), e.getMessage()); } @ExceptionHandler(Exception.class) public Result<?> handleException(Exception e) { return Result.error(e.getMessage()); } }
完整 Controller 示例
UserController 完整示例
package com.example.ecommerce.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.example.ecommerce.common.Result; import com.example.ecommerce.entity.User; import com.example.ecommerce.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/api/users") public class UserController { @Autowired private UserService userService; /** * 查询用户列表 */ @GetMapping public Result<Page<User>> listUsers( @RequestParam(defaultValue = "1") Integer current, @RequestParam(defaultValue = "10") Integer size ) { Page<User> page = new Page<>(current, size); Page<User> result = userService.page(page); return Result.success(result); } /** * 查询用户详情 */ @GetMapping("/{id}") public Result<User> getUser(@PathVariable Long id) { User user = userService.getById(id); return Result.success(user); } /** * 创建用户 */ @PostMapping public Result<User> createUser(@RequestBody User user) { User created = userService.register(user); return Result.success(created); } /** * 更新用户 */ @PutMapping("/{id}") public Result<User> updateUser(@PathVariable Long id, @RequestBody User user) { user.setId(id); userService.updateById(user); return Result.success(user); } /** * 删除用户 */ @DeleteMapping("/{id}") public Result<?> deleteUser(@PathVariable Long id) { userService.removeById(id); return Result.success(); } /** * 用户登录 */ @PostMapping("/login") public Result<User> login(@RequestParam String username, @RequestParam String password) { User user = userService.login(username, password); return Result.success(user); } }
API 文档
API 端点列表
官方资源
- Spring MVC 文档:https://docs.spring.io/spring-framework/reference/web/webmvc.html
- RESTful API 设计指南:https://restfulapi.net/
本节小结
在本节中,我们学习了:
第一个是 RESTful API 设计。 使用资源导向的 URL 设计和 HTTP 方法。
第二个是请求参数处理。 使用 @PathVariable、@RequestParam、@RequestBody 获取参数。
第三个是响应结果封装。 使用 Result 类统一封装响应结果。
第四个是异常处理。 使用 @RestControllerAdvice 实现全局异常处理。
这就是 Controller 层实现。Controller 层是系统的入口,负责接收请求和返回响应。
在下一节,我们将学习如何统一响应格式,提高 API 的一致性。