spring boot 统一RESTful风格处理

2023/6/6 java

# RESTful 风格规范

# 1.HTTP 协议的请求动作

动作 说明
GET 在 URL 中传递参数,一般用户定义“查询”功能接口
POST 通过请求体传递参数,一般用于定义实现“查询”和插入功能的接口
PUT 一般用于定义实现“更新”功能的接口
DELETE 一般用于定义“删除”功能的接口

# 2.HTTP 返回码说明

返回码 说明
200 服务端正确地处理了请求
201 根据(创建数据的)请求以及参数正确地创建对象
301 请求所对应的服务被重定向到其他 URL 地址,此时会进行请求重定向操作
400 服务器不理解请求的语法,一般指参数错误
404 服务器找不到请求的页面
500 服务器遇到错误,无法返回请求
504 网关超时,所以无法返回请求

# 3.增删改查方法对应的 RESTful 接口名

动作 URL 请求 HTTP 动作 参数说明
查询指定 id 的库存 /stock/{id} GET {id}表示带查询的库存数据 id
查询所有库存信息 /stocks GET 返回所有库存,无需参数
创建新的库存数据 /stock POST 在请求体(Body)中传入待插入的库存数据
修改指定 id 的库存 /stock/{id} PUT {id}表示待修改的库存数据 id,而具体待修改的库存数据会通过请求体(Body)传入
删除指定 id 的库存 /stock/{id} DELETE {id}表示待删除的库存数据 id

一般通过/{id}的形式传递参数

# RESTful 风格实现

# 1.HttpCodeEnum 返回码和返回信息

public enum HttpCodeEnum {
    //用枚举的方式定义Http返回码和返回信息
    OK(200, "OK"),
    CREATEOK(201, "CREATEOK"),
    REDIRECT(301, "REDIRECT"),
    PARAM_ERROR(400,"PARAM_ERROR"),
    NOT_FOUND(404, "NOT_FOUND"),
    SERVER_ERROR(500, "SERVER_ERROR");
    //http返回码和返回信息的变量
    private Integer httpCode;
    private String httpMsg;
    //通过构造函数传入http返回码和返回信息
    HttpCodeEnum(Integer code, String msg) {
        this.httpCode = code;
        this.httpMsg = msg;
    }
    public void setHttpCode(Integer httpCode) {
        this.httpCode = httpCode;
    }
    public void setHttpMsg(String httpMsg) {
        this.httpMsg = httpMsg;
    }
    public Integer getHttpCode() {
        return httpCode;
    }
    public String getHttpMsg() {
        return httpMsg;
    }
}

# 2.HttpReturn 统一返回信息

import java.io.Serializable;

public class HttpReturn  <T> implements Serializable {
    //http返回码
    private Integer httpCode;
    //http返回码对应的信息
    private String httpMsg;
    //返回的数据,用泛型定义
    private T data;

    public Integer getHttpCode() {
        return httpCode;
    }

    public void setHttpCode(Integer httpCode) {
        this.httpCode = httpCode;
    }

    public String getHttpMsg() {
        return httpMsg;
    }

    public void setHttpMsg(String httpMsg) {
        this.httpMsg = httpMsg;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    public HttpReturn(HttpCodeEnum httpCodeEnum, T data) {
        this.httpCode = httpCodeEnum.getHttpCode();
        this.httpMsg = httpCodeEnum.getHttpMsg();
        this.data = data;
    }

    @Override
    public String toString() {
        return "HttpResult{" +
                ", httpCode=" + httpCode +
                ", httpMsg=" + httpMsg +
                ", data='" + data + '\'' +
                '}';
    }

}

# 3.使用

参数错误

@RequestMapping( value = "/stock/{id}",method = RequestMethod.GET)
public HttpReturn getStockByID(@PathVariable Integer id){
    //如果id大于100,则抛出自定义的异常
    if(id>100){
        throw new ParamException(400,"Param id is more than 100");
    }
    return new HttpReturn(HttpCodeEnum.OK, stockHM.get(id));
}

正确返回

@RequestMapping( value = "/stocks",method = RequestMethod.GET)
public HttpReturn getStocks(){
    //返回整个HashMap里包含的数据
    return new HttpReturn(HttpCodeEnum.OK, stockHM);
}

# 4.异常处理

参数异常类exception/ParamException.java

public class ParamException extends RuntimeException {

    //错误码,一般的http返回码对应
    private Integer errorCode;
    //错误信息
    private String errorMsg;

    public ParamException(Integer errorCode,String errorMsg){
        this.errorCode = errorCode;
        this.errorMsg = errorMsg;
    }

    public void setErrorCode(Integer errorCode) {
        this.errorCode = errorCode;
    }

    public void setErrorMsg(String errorMsg) {
        this.errorMsg = errorMsg;
    }

    public Integer getErrorCode() {
        return errorCode;
    }

    public String getErrorMsg() {
        return errorMsg;
    }
}

全局异常处理exception/GlobalExceptionHandler.java

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(ParamException.class)
    public HttpReturn handlerParamException(ParamException e) {
        HttpCodeEnum httpCodeEnum;
        httpCodeEnum = HttpCodeEnum.PARAM_ERROR;
        return new HttpReturn(httpCodeEnum,e.getErrorMsg());
    }

    @ExceptionHandler(Exception.class)
    public HttpReturn handlerOtherException(Exception e) {
        HttpCodeEnum httpCodeEnum;
        // 其他异常,当我们定义了多个异常时,这里可以增加判断和记录
        httpCodeEnum = HttpCodeEnum.SERVER_ERROR;
        return new HttpReturn(httpCodeEnum,e.getMessage());
    }
}

使用

@RequestMapping( value = "/stock/{id}",method = RequestMethod.GET)
public HttpReturn getStockByID(@PathVariable Integer id){
    //如果id大于100,则抛出自定义的异常
    if(id>100){
        throw new ParamException(400,"Param id is more than 100");
    }
    return new HttpReturn(HttpCodeEnum.OK, stockHM.get(id));
}