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));
}