Taro@3.3.3最新版本开发企业级出行项目

388 阅读3分钟

Taro@3.3.3最新版本开发企业级出行项目

为什么要对SpringBoot返回统一的规范格式

在默许状况下,SpringBoot的返回格式常见的有三种:

第一种:返回 String

@GetMapping("/hello")
public String getStr(){
  return "hello,javadaily";
}
复制代码

此时调用接口获取到的返回值是这样:

hello,javadaily
复制代码

第二种:返回自定义对象

@GetMapping("/aniaml")
public Aniaml getAniaml(){
  Aniaml aniaml = new Aniaml(1,"pig");
  return aniaml;
}
复制代码

此时调用接口获取到的返回值是这样:

{
  "id": 1,
  "name": "pig"
}
复制代码

第三种:接口异常

@GetMapping("/error")
public int error(){
    int i = 9/0;
    return i;
}
复制代码

此时调用接口获取到的返回值是这样:

{
  "timestamp": "2021-07-08T08:05:15.423+00:00",
  "status": 500,
  "error": "Internal Server Error",
  "path": "/wrong"
}
复制代码

基于以上种种状况,假如你和前端开发人员联调接口她们就会很懵逼,由于我们没有给他一个统一的格式,前端人员不晓得如何处置返回值。

还有甚者,有的同窗比方小张喜欢对结果停止封装,他运用了Result对象,小王也喜欢对结果停止包装,但是他却运用的是Response对象,当呈现这种状况时我置信前端人员一定会抓狂的。

所以我们项目中是需求定义一个统一的规范返回格式的。

定义返回规范格式

一个规范的返回格式至少包含3局部:

  1. status 状态值:由后端统一定义各种返回结果的状态码

  2. message 描绘:本次接口调用的结果描绘

  3. data 数据:本次返回的数据。

    { "status":"100", "message":"操作胜利", "data":"hello,javadaily" } 复制代码

当然也能够按需参加其他扩展值,比方我们就在返回对象中添加了接口调用时间

  1. timestamp: 接口调用时间

定义返回对象

@Data
public class ResultData<T> {
  /** 结果状态 ,详细状态码参见ResultData.java*/
  private int status;
  private String message;
  private T data;
  private long timestamp ;
  public ResultData (){
    this.timestamp = System.currentTimeMillis();
  }
  public static  ResultData success(T data) {
    ResultData resultData = new ResultData<>();
    resultData.setStatus(ReturnCode.RC100.getCode());
    resultData.setMessage(ReturnCode.RC100.getMessage());
    resultData.setData(data);
    return resultData;
  }
  public static  ResultData fail(int code, String message) {
    ResultData resultData = new ResultData<>();
    resultData.setStatus(code);
    resultData.setMessage(message);
    return resultData;
  }
}
复制代码

定义状态码

public enum ReturnCode {
    /**操作胜利**/
    RC100(100,"操作胜利"),
    /**操作失败**/
    RC999(999,"操作失败"),
    /**效劳限流**/
    RC200(200,"效劳开启限流维护,请稍后再试!"),
    /**效劳降级**/
    RC201(201,"效劳开启降级维护,请稍后再试!"),
    /**热点参数限流**/
    RC202(202,"热点参数限流,请稍后再试!"),
    /**系统规则不满足**/
    RC203(203,"系统规则不满足请求,请稍后再试!"),
    /**受权规则不经过**/
    RC204(204,"受权规则不经过,请稍后再试!"),
    /**access_denied**/
    RC403(403,"无访问权限,请联络管理员授予权限"),
    /**access_denied**/
    RC401(401,"匿名用户访问无权限资源时的异常"),
    /**效劳异常**/
    RC500(500,"系统异常,请稍后重试"),
    INVALID_TOKEN(2001,"访问令牌不合法"),
    ACCESS_DENIED(2003,"没有权限访问该资源"),
    CLIENT_AUTHENTICATION_FAILED(1001,"客户端认证失败"),
    USERNAME_OR_PASSWORD_ERROR(1002,"用户名或密码错误"),
    UNSUPPORTED_GRANT_TYPE(1003, "不支持的认证形式");
    /**自定义状态码**/
    private final int code;
    /**自定义描绘**/
    private final String message;
    ReturnCode(int code, String message){
        this.code = code;
        this.message = message;
    }
    public int getCode() {
        return code;
    }
    public String getMessage() {
        return message;
    }
}
复制代码

统一返回格式

@GetMapping("/hello")
public ResultData getStr(){
	return ResultData.success("hello,javadaily");
}
复制代码

此时调用接口获取到的返回值是这样:

{
  "status": 100,
  "message": "hello,javadaily",
  "data": null,
  "timestamp": 1625736481648,
  "httpStatus": 0
}

download