1. 程式人生 > 其它 >SpringBoot介面格式和規範

SpringBoot介面格式和規範

SpringBoot介面格式

概述:通過對介面返回格式的統一定義方便接收方統一呼叫和傳送端處理。

通過對響應型別的列舉定義、返回格式的模板化、springboot的統一返回攔截處理和統一返回異常處理。

介面響應標準定義

{
    "code": 10001,
    "message": "XXXX",
    "data": {
        "XXX": "XXX"
    }
}

響應列舉型別

public class Enum ResultEnum{
	SUCCESS(1000,"成功"),
    SYSTEM_ERROR(5000,"系統內部異常"),
   	//追加自定義型別
    ;
    private Integer code;
    private String message;
    ResultEnum(Integer code, String message) {
        this.code = code;
        this.message = message;
    }
}

返回型別格式


@Data
public class Result<T>{
    private Integer code;
    private String  message;
    private T data;

    /**
     * 定義成功無返回值方法
     * @return
     */
    public static  Result successResult() {
        return getSuccessResult();
    }

    /**
     * 定義成功有data方法
     * @param data
     * @return
     */
    public static  Result successResult(Object data) {
        Result result =getSuccessResult();
        result.setData(data);
        return result;
    }
    private static Result getSuccessResult(){
        Result result = new Result();
        result.setCode(ResultEnum.SUCCESS.getCode());
        result.setMessage(ResultEnum.SUCCESS.getMessage());
        return result;
    }

    /**
     * 定義異常無返回值方法
     * @return
     */
    public static  Result errorResult() {
        return getErrorResult();
    }

    /**
     * 定義成異常有data方法
     * @param data
     * @return
     */
    public static  Result errorResult(Object data) {
        Result result =getErrorResult();
        result.setData(data);
        return result;
    }
    private static Result getErrorResult(){
        Result result = new Result();
        result.setCode(ResultEnum.SYSTEM_ERROR.getCode());
        result.setMessage(ResultEnum.SYSTEM_ERROR.getMessage());
        return result;
    }

    /**
     * 根據ResultEnum獲取返回值資訊
     * @param resultEnum
     * @param data
     * @return
     */
    public static  Result result(ResultEnum resultEnum,Object data) {
        Result result = new Result();
        result.setCode(resultEnum.getCode());
        result.setMessage(resultEnum.getMessage());
        result.setData(data);
        return result;
    }
}

全域性返回值

ResponseBodyAdvice<Object>介面 原始碼閱讀

ResponseBodyAdvice的作用:攔截Controller方法的返回值,統一處理返回值/響應體,一般用來做response的統一格式、加解密、簽名等等。

public interface ResponseBodyAdvice <T> {
    //是否支援攔截
    boolean supports(org.springframework.core.MethodParameter methodParameter, java.lang.Class<? extends org.springframework.http.converter.HttpMessageConverter<?>> aClass);
	//自定義的介面處理
    @org.springframework.lang.Nullable
    T beforeBodyWrite(@org.springframework.lang.Nullable T t, org.springframework.core.MethodParameter methodParameter, org.springframework.http.MediaType mediaType, java.lang.Class<? extends org.springframework.http.converter.HttpMessageConverter<?>> aClass, org.springframework.http.server.ServerHttpRequest serverHttpRequest, org.springframework.http.server.ServerHttpResponse serverHttpResponse);
}

自定義的ResponseHandler

//全域性攔截包定義
@RestControllerAdvice(basePackages = "com.xxx.controller")
public class ResponseHandler implements ResponseBodyAdvice<Object> {
    @Override
    public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
        return true;
    }

    @Override
    public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class<?
            extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest,
                                  ServerHttpResponse serverHttpResponse) {
        //對返回的Object物件處理
        //String 格式是比較特殊的
        if (o instanceof String) {
            return JSONObject.toJSONString(Result.successResult(o));
        }
        return Result.successResult(o);
    }
}

異常處理介面

@RestControllerAdvice,Springboot提供的對所有的全域性處理方法。

它通常用來定義@ExceptionHandler@InitBinder以及@ModelAttribute 適用於所有方法@RequestMapping的方法。

  1. 異常處理。
  2. 在其執行之前初始化資料繫結器。
  3. 把值繫結到Model中,使全域性@RequestMapping可以獲取到該值。

@RestControllerAdvice
public class GlobalExceptionAdvice {
    /**
     * 處理執行時異常
     */
    //定義返回值response的httpcode
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    @ExceptionHandler(Throwable.class)
    public Result handleThrowable(Throwable e, HttpServletRequest request) {
        //結合ErrorResult對異常及結果資訊進行捕獲返回
        return errorResult;
    }

    /**
     * 處理自定義異常
     */
    @ExceptionHandler(BusinessException.class)
    public Result handleBusinessException(BusinessException e, HttpServletRequest request) {
        //結合ErrorResult對異常及結果資訊進行捕獲返回
        return errorResult;
    }
}

自定義異常

自定義異常定義使用

引數的校驗。處理,空值物件的引用(NullPointerException)、陣列下標越界(ArrayIndexOutBoundException)

public class BusinessException extends RuntimeException {

    protected Integer code;

    protected String message;

    public  BusinessException(ResultEnum resultEnum){
        this.code = resultEnum.getCode();
        this.errMsg = resultEnum.getMsg();
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getErrMsg() {
        return errMsg;
    }

    public void setErrMsg(String errMsg) {
        this.errMsg = errMsg;
    }
}