在 web 开发过程中, 后端要统一返回的数据结构,便于前端处理。例如每个请求,我们都需要知道 :
package com.ieslab.powergrid.demosvr.entity;
/** Title: PersonService
* Description: 通用Rest请求返回结构
*
* @author bingge
* @date 2020-2-20 下午7:15:30
* @version V1.0
*/
public class Result {
//服务器返回的状态码(主要给程序员看)。例如 : 200 : 请求成功, 500 : 服务器内部错误,400 : 未知错误
private Integer code;
//返回码 1:成功 10000:系统错误 10001:参数错误 ...
private Integer status;
// 服务器的错误信息 ,主要返回给用户看
private String msg;
// 服务器返回的数据
private Object data;
public Result() {
}
//返回操作成功
public static Result ok() {
return ok(null);
}
//返回操作成功
public static Result ok(Object data) {
Result result = new Result();
result.setCode(200);
result.setStatus(1);
result.setMsg("请求成功");
result.setData(data);
return result;
}
//返回操作成功
public static Result error() {
return error("请求失败");
}
//返回操作成功
public static Result error(Integer code, Integer status, String msg) {
Result result = new Result();
result.setCode(code);
result.setStatus(status);
result.setMsg(msg);
return result;
}
//返回操作成功
public static Result error(String msg) {
return error(500,0, msg);
}
//返回操作成功
public static Result error(ErrorStatus errorStatus) {
return error(500,errorStatus.value(), errorStatus.getMessage());
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
}
package com.ieslab.powergrid.demosvr.entity;
/** Title: PersonService
* Description: 通用Rest请求返回错误码结构
*
* @author bingge
* @date 2020-2-20 下午7:15:30
* @version V1.0
*/
public enum ErrorStatus {
/**
* 系统内部错误
*/
INTERNAL_SERVER_ERROR(10000, "系统错误"),
/**
* 参数错误
*/
ILLEGAL_ARGUMENT(10001, "参数错误"),
/**
* 业务错误
*/
SERVICE_EXCEPTION(10002, "业务错误"),
/**
* 非法的数据格式,参数没有经过校验
*/
ILLEGAL_DATA(10003, "数据错误"),
MULTIPART_TOO_LARGE(1004,"文件太大"),
/**
* 非法状态
*/
ILLEGAL_STATE(10005, "非法状态"),
/**
* 缺少参数
*/
MISSING_ARGUMENT(10006, "缺少参数"),
/**
* 非法访问
*/
ILLEGAL_ACCESS(10007, "非法访问,没有认证"),
/**
* 权限不足
*/
UNAUTHORIZED(10008, "权限不足"),
/**
* 错误的请求
*/
METHOD_NOT_ALLOWED(10009, "不支持的方法"),
/**
* 参数错误
*/
ILLEGAL_ARGUMENT_TYPE(10010, "参数类型错误");
private final int value;
private final String message;
ErrorStatus(int value, String message) {
this.value = value;
this.message = message;
}
/**
* Return the integer value of this status code.
*/
public int value() {
return this.value;
}
/**
* Return the reason phrase of this status code.
*/
public String getMessage() {
return this.message;
}
}
package com.ieslab.powergrid.demosvr.utils;
import com.ieslab.powergrid.demosvr.entity.MyException;
import com.ieslab.powergrid.demosvr.entity.Result;
import org.springframework.web.bind.MissingServletRequestParameterException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.HashMap;
import java.util.Map;
/** Title: GlobleExceptionHandler
* Description: 全局异常捕捉处理
*
* @author houpeibin
* @date 2020-2-20 下午7:15:30
* @version V1.0
*/
@ControllerAdvice
public class GlobleExceptionHandler {
@ResponseBody
@ExceptionHandler(value = Exception.class)
public Result errorHandler(Exception ex) {
//判断异常的类型,返回不一样的返回值
if(ex instanceof MissingServletRequestParameterException){
return Result.error(400, 0, "全局异常捕捉:缺少必需参数:"
+((MissingServletRequestParameterException) ex).getParameterName());
}
else if(ex instanceof MyException){
return Result.error(400, 0, "全局异常捕捉:这是自定义异常");
}
return Result.error(400, 0, "全局异常捕捉:未知异常");
}
}
详细用法可以参考:Spring Boot2.x:统一异常处理
package com.ieslab.powergrid.demosvr.controller;
import com.ieslab.powergrid.demosvr.entity.ErrorStatus;
import com.ieslab.powergrid.demosvr.entity.Result;
import com.ieslab.powergrid.demosvr.service.PersonService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
@RestController
@RequestMapping("/rest")
public class RestTestController {
@Autowired
PersonService personService;
@RequestMapping("/index")
public Result getData(String id){
Map map = new HashMap<>();
map.put("id", id);
return Result.ok(personService.getPersons(map));
}
@RequestMapping("/index2")
public Result getData2(){
return Result.error(ErrorStatus.INTERNAL_SERVER_ERROR);
}
@RequestMapping("/index3")
public Result getData3(){
int a = 1/0;
return Result.ok();
}
}
分别访问:http://localhost:8080/rest/index?id=1
访问:http://localhost:8080/rest/index2
访问:http://localhost:8080/rest/index3
对于错误码的定义,需要根据业务要求进行详细定义,这样,在前后端调试时,可以节省很多的时间,也会避免不必要的扯皮。