3.7Controller层实现

分类: 搭建单体商城服务

Controller 层实现

Controller 层是表现层,负责接收 HTTP 请求,调用 Service 层处理业务逻辑,返回响应结果。本节将学习如何实现 Controller 层。

本节将学习:RESTful API 设计、请求参数处理、响应结果封装,以及异常处理。

RESTful API 设计

RESTful 设计原则

RESTful API 设计原则:

  1. 资源导向:URL 表示资源,不是动作
  2. HTTP 方法:使用 GET、POST、PUT、DELETE 表示操作
  3. 状态码:使用 HTTP 状态码表示结果
  4. 无状态:每个请求都是独立的

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 端点列表

官方资源

本节小结

在本节中,我们学习了:

第一个是 RESTful API 设计。 使用资源导向的 URL 设计和 HTTP 方法。

第二个是请求参数处理。 使用 @PathVariable、@RequestParam、@RequestBody 获取参数。

第三个是响应结果封装。 使用 Result 类统一封装响应结果。

第四个是异常处理。 使用 @RestControllerAdvice 实现全局异常处理。

这就是 Controller 层实现。Controller 层是系统的入口,负责接收请求和返回响应。

在下一节,我们将学习如何统一响应格式,提高 API 的一致性。