在Spring Boot项目中,统一 API 响应结果封装是一种常用的技术实践,旨在提高开发效率、降低代码重复率,并提供一致的API响应格式,从而简化前后端交互和错误处理。
文章目录
封装内容
响应结果封装是将后端服务返回的响应数据按照统一的格式进行封装,这个格式通常包括状态码、状态信息(或称为消息)、返回数据等关键信息。
- 状态码(Code):表示请求的处理结果,如成功、失败、特定错误等。状态码通常是一组预定义的整数或枚举值。
- 状态信息/消息(Message):与状态码相对应的文本描述,用于提供关于请求处理结果的更多信息。
- 返回数据(Data):实际业务处理的结果数据,其类型可能因API而异。
此外,有些封装还会包含时间戳、请求ID等附加信息,以便于日志追踪和问题排查。
封装示例
1、Result
java
package com.wen.data;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 统一 API 响应结果封装
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Result<T> {
private int code;
private String message;
private T data;
public Result<T> setCode(ResultCode resultCode) {
this.code = resultCode.code;
this.message = resultCode.message;
return this;
}
public Result<T> setMessage(String message) {
this.message = message;
return this;
}
public Result<T> setData(T data) {
this.data = data;
return this;
}
}
2、ResultCode
java
package com.wen.data;
/**
* 响应码枚举
*/
public enum ResultCode {
// 这里可以根据多个场景设置不同的响应码,供前端判断问题并进行解释
SUCCESS(1,"SUCCESS"),
FAIL(400,"FAIL"),
NOT_FOUND(401,"interface not found"),
ERROR(500,"System Exception!");
public int code;
public String message;
ResultCode(int code, String message){
this.code = code;
this.message = message;
}
}
3、ResultGenerator
java
package com.wen.data;
/**
* 响应结果生成
*/
public class ResultGenerator {
public static Result<?> genSuccessResult(){
return new Result<>().setCode(ResultCode.SUCCESS);
}
public static Result<?> genSuccessResult(Object data){
return new Result<>().setCode(ResultCode.SUCCESS).setData(data);
}
public static Result<?> genFailResult(String message){
return new Result<>().setCode(ResultCode.FAIL).setMessage(message);
}
public static Result<?> genSpecialResult(ResultCode resultCode, String message){
return new Result<>().setCode(resultCode).setMessage(message);
}
}
4、TestController
java
package com.wen.controller;
import com.wen.data.Result;
import com.wen.data.ResultGenerator;
import com.wen.dto.TbUser;
import com.wen.service.TestService;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/test")
public class TestController {
@Autowired
private TestService testService;
@GetMapping("/select")
public Result<?> selectUserByPage(
@Param("pageSize") Integer pageSize,
@Param("pageNumber") Integer pageNumber){
// 生成结果
return ResultGenerator.genSuccessResult(testService.selectUserByPage(pageSize, pageNumber));
}
}
5、生成结果
json
{
"code": 1,
"message": "SUCCESS",
"data": "2024-07-19"
}