接口统一返回(拿去即用)

607 阅读3分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活

写在前面

每个接口,每个公司,每个项目工程都应该有自己统一风格的返回,这是和前端的约定,这是每一套代码的“脸面”。至关重要。

下面大家看看我们平时怎么用的骚操作。

统一返回ResultBO

话不多说,直接上代码


/**
 * http 响应数据结构
 * @author yn
 * @date 2021/10/23.
 */
public class ResultBO<T> implements Serializable {

  //失败
  public static final int ERROR = 0;
  //成功
  public static final int SUCCESS = 1;

  //返回结果标示  
  private Integer completeCode;

  //业务标示  
  private String reasonCode;

  //业务 错误日志或者成功代码  
  private String reasonMessage;

  //业务参数返回(任何类型)
  private T data;

  /**
   * 外部不要直接new对象
   * 用builder模式
   */
  private ResultBO(Builder<T> builder) {
    this.reasonCode = builder.reasonCode;
    this.reasonMessage = builder.reasonMessage;
    this.completeCode = builder.completeCode;
    this.data = builder.data;
  }

  @Deprecated
  public ResultBO(){
  }

  public Integer getCompleteCode() {
    return completeCode;
  }
  public String getReasonCode() {
    return reasonCode;
  }
  public String getReasonMessage() {
    return reasonMessage;
  }
  public T getData() {
    return data;
  }


  @Deprecated
  public ResultBO<T> setCompleteCode(Integer completeCode) {
    this.completeCode = completeCode;
    return this;
  }
  @Deprecated
  public ResultBO<T> setReasonCode(String reasonCode) {
    this.reasonCode = reasonCode;
    return this;
  }
  @Deprecated
  public ResultBO<T> setReasonMessage(String reasonMessage) {
    this.reasonMessage = reasonMessage;
    return this;
  }
  @Deprecated
  public ResultBO<T> setData(T data) {
    this.data = data;
    return this;
  }

  public boolean isResponseOk(){
    return this.getCompleteCode() != null && this.getCompleteCode() == SUCCESS;
  }

  @Override
  public String toString() {
    return "ResultBO{" +
        "completeCode=" + completeCode +
        ", reasonCode='" + reasonCode + ''' +
        ", reasonMessage='" + reasonMessage + ''' +
        ", data=" + (data == null ? "null" : data.toString()) +
        '}';
  }

  public static ResultBO responseFail(String s) {
    return ResultBO.Builder.init().setFailMessage(s).build();
  }

  public static ResultBO ResultBOEnum(ResultBOEnum rresultBOEnum) {
    return ResultBO.Builder.init().setResultBOEnum(resultBOEnum).build();
  }


  public static ResultBO responseOK() {
    return ResultBO
            .Builder
            .init()
            .setResultBOEnum(ResultBOEnum.SUCCESS)
            .build();
  }

  public static class Builder<K>{
    private Integer completeCode;

    private String reasonCode;

    private String reasonMessage;

    private K data;

    private Builder(ResultBOEnum resultBOEnum){
      if (resultBOEnum == ResultBOEnum.SUCCESS){
        this.completeCode = SUCCESS;
      } else {
        this.completeCode = ERROR;
      }
      this.reasonCode = resultBOEnum.getCode();
      this.reasonMessage = resultBOEnum.getMessage();
    }

    static public <K> Builder<K> init() { return new Builder<>(ResultBOEnum.SUCCESS); }
    public Builder<K> setCompleteCode(int code) {
      this.completeCode = code;
      return this;
    }
    public Builder<K> setReasonCode(String code) {
      this.reasonCode = code;
      return this;
    }

    public Builder<K> setReasonMessage(String msg) {
      this.reasonMessage = msg;
      return this;
    }

    public Builder<K> setFailMessage(String msg) {
      this.reasonMessage = msg;
      this.completeCode = ERROR;
      return this;
    }

    public Builder<K> setResultBOEnum(ResultBOEnum resultBOEnum) {
      if (resultBOEnum == ResultBOEnum.SUCCESS){
        this.completeCode = SUCCESS;
      } else {
        this.completeCode = ERROR;
      }
      this.reasonMessage = resultBOEnum.getMessage();
      this.reasonCode = resultBOEnum.getCode();
      return this;
    }

    public Builder<K> setData(K k) {
      this.data = k;
      return this;
    }

    public ResultBO<K> build() { return new ResultBO<>(this); }
  }


}

代码很简单 拿去即用,也可以进行二次开发。统一返回code我们采用了阿里规约规定的返回code。下面看下

/**
 * ResultBO 返回码
 * @author yn
 */
public enum ResultBOEnum {

  /**
   * 码表注释
   * A业务错误,B系统错误,C第三方调用错误
   * 数字前两位为业务,后三位为错误码,1开始到999,0为保留位
   * 业务码表
   * 01:用户
   * 04:优惠券
   * .....
   */
  SUCCESS("000000", "成功"),

  /**
   * 用户码表
   */
  ERROR_A01001("A01001", "用户不存在"),

  /**
   * 优惠券码表
   */
  ERROR_A04001("A04001", "活动已结束"),

  ERROR_A04002("A04002", "优惠券不可用"),

  ERROR_A04003("A04003","很抱歉,优惠券领光了!下次早点来哟~"),


 ........


  /**
   * 系统异常码表
   */

  ERROR_B00001("B00001","系统执行异常"),

  ERROR_B00002("B00002","系统执行超时");

  private String code;
  private String message;

  ResponseBOEnum(String code, String message) {
    this.code = code;
    this.message = message;
  }

  public String getCode() {
    return this.code;
  }

  public String getMessage() {
    return this.message;
  }

}

两者结合使用,让你代码显得更专业,接口更健壮,我们看下如何使用。

/**
 * 测试统一返回
 * @return
 */
@RequestMapping(value = "testApi")
public ResultBO testApi(@RequestParam("userId") Integer userId){
    User user = userService.findById(userId);
    if(null == user){
        return ResultBO.responseFail("用户不存在")
    }
    //业务处理成功
    return ResultBO.responseOK();
    
}

总结

统一返回是根据自己公司业务自定义,没有完全适合,只能说大体适用即可

弦外之音

感谢你的阅读,如果你感觉学到了东西,麻烦您点赞,关注。也欢迎有问题我们下面评论交流

加油! 我们下期再见!

给大家分享几个我前面写的几篇骚操作

聊聊不一样的策略模式(值得收藏)

copy对象,这个操作有点骚!