为什么使用枚举?枚举与http状态码响应体封装
基本响应体封装(无返回数据时使用)数据响应体封装(有数据时使用)
为什么使用枚举?枚举(enum),是指一个经过排序的、被打包成一个单一实体的项列表。一个枚举的实例可以使用枚举项列表中任意单一项的值。枚举在各个语言当中都有着广泛的应用,通常用来表示诸如颜色、方式、类别、状态等等数目有限、形式离散、表达又极为明确的量。Java从JDK5开始,引入了对枚举的支持。
具体可参考百度百科。此处主要是展示下如何使用枚举。
枚举与http状态码相信一个比较成熟的项目必然是有着严格的规范的,而规范不仅仅是为了统一大家的阅读,更重要的是可以便于项目的维护,一个项目真正开发的时间远远是低于它运维的时间的,日志的功能就能很好的发现问题、记录问题与解决问题。那日志的记录也少不了服务端构造一个响应体来进行更多信息的汇集,那么讲了那么多,具体枚举是怎么用的呢?
package com.lcb.enums;
public enum CodeEnum {
OK(200,"数据传输成功!"),
NO_CONTENT(204,"无数据传送!"),
CREATED(201,"数据已创建!"),
RESET_CONTENT(205,"数据已更新!!"),
GONE(410,"数据已删除"),
NOT_FOUND(404,"未发现资源!"),
REQUEST_TIME_OUT(408,"请求超时!"),
ERROR(500,"服务器无法完成请求!");
private final int code ;
private final String msg ;
CodeEnum(int code, String msg) {
this.code=code;
this.msg=msg;
}
public int getCode() {
return code;
}
public String getMsg() {
return msg;
}
}
首先我们的项目肯定要分层次,结构清晰,找代码也会更加的容易,一个项目的枚举类可以有很多,我们可以单独的给它划分出一个包出来,注意命名规范,一般以enums命名!
其次可以查询对应的http状态码信息,指定你想返回来的提示信息!
然后需要声明构造函数,个人认为最好把变量定义为final的,枚举都是提前定义好的,我们也不用再set一次,就直接get,提取出对应的信息就行了。
同时呢,我觉得也是解决服务器端session跨域问题的一个比较好用的另外一个方法吧。之前有写过项目放到云服务器上,但是前端的session问题就一直很烦,可能是经验不到位一直卡着。cookie里面也是带有状态码的。也可以把这个码的值与枚举的值对比返回对应提醒信息,也可以直接在你响应请求的时候,处理逻辑的时候,自定义返回的封装,就不用它cookie中的session信息,而是作为一个对象转换成json数据返回给前端就行。具体来说说后面的这个。
响应体封装我们需要一个响应体进行所有请求的加工返回信息。
基本响应体封装(无返回数据时使用)package com.lcb.utils.response;
import com.lcb.enums.CodeEnum;
public class baseResponse {
private int code;//响应码
private String msg;//响应消息
protected baseResponse() {}
protected baseResponse(CodeEnum code) {
this.code = code.getCode();
this.msg = code.getMsg();
}
public static baseResponse getInstance(CodeEnum code) {//传递封装对象
return new baseResponse(code);
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
注意需要导入我们定义的枚举包类。把构造方法定义为protected,让子类能够继承。
数据响应体封装(有数据时使用)package com.lcb.utils.response; import com.lcb.enums.CodeEnum; public class DataResponseextends baseResponse { private T data;//接收任意类型数据 private DataResponse() {} private DataResponse(CodeEnum code, T data) { super(code); this.data = data; } public static DataResponse getInstance(CodeEnum code, T data) {//传递封装对象 return new DataResponse (code, data); } public T getData() { return data; } public void setData(T data) { this.data = data; } }
声明一个泛型的数据字段,用于接收任意数据的传递,就比基类的多了一个存储数据的字段。构造方法私有,不能直接new对象,可以通过getInstance()方法获取实例。
下面是一个ssm的接口例子
package com.lcb.controller;
import com.lcb.enums.CodeEnum;
import com.lcb.service.CityService;
import com.lcb.utils.response.baseResponse;
import com.lcb.utils.response.DataResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/city")
@CrossOrigin
public class CityController {
@Autowired
private CityService cityService;
@RequestMapping("/getCity")
@ResponseBody
public baseResponse getCity(){//返回类型是父类对象
if (cityService.getCity().size()>0 && cityService.getCity()!=null) {
return DataResponse.getInstance(CodeEnum.OK, cityService.getCity());
}else {
return baseResponse.getInstance(CodeEnum.NO_CONTENT);
}
}
}
希望本文对后端响应体有疑惑的同学能有所帮助!



