在web开发时,请求返回一般有两类。一类是数据(一般为json格式),一类是页面。
@GetMapping("/hello") public String hello1(){ //这里使用的thymeleaf,会去找hello.html return "hello"; } @ResponseBody @GetMapping("/hello") public String hello2(){ //直接返回字符串 return "hello lhb"; }
这显然不太规范,会给前后端开发人员之间的沟通和协作带来麻烦。
正确的做法是设计规范的接口并进行封装。
服务端返回的数据格式(json)
{ "code":0 "msg" : "data":{},[] }
code:代表错误码。具体的错误码是需要自定义的,例如:0代表成功,777代表服务器异常等。
msg:代表错误信息
data:代表成功时的数据,可以是json对象或数组。
{ "code":777 "msg" :"服务器异常" "data":{} }
接下来让我们来看一个封装的实例:
Result类:
public class Result<T> { private int code; private String msg; private T data; /** * 请求成功时调用 * @param data * @return */ public static <T> Result<T> success(T data){ return new Result<T>(data); } public static <T> Result<T> error(CodeMsg cm){ return new Result<T>(cm); } /** * 只传入数据默认成功,所以添加默认的code和msg * @param data */ private Result(T data) { this.code=0; this.msg="success"; this.data=data; } private Result(CodeMsg cm) { if(cm==null){ return; } this.code=cm.getCode(); this.msg=cm.getMsg(); } public int getCode() { return code; } public String getMsg() { return msg; } public T getData() { return data; } }
CodeMsg类:
public class CodeMsg { private int code; private String msg; //通用的错误码 public static CodeMsg SUCCESS = new CodeMsg(0, "success"); public static CodeMsg SERVER_ERROR = new CodeMsg(777, "服务端异常"); public int getCode() { return code; } public String getMsg() { return msg; } private CodeMsg(int code,String msg) { this.code = code; this.msg = msg; } }
为什么要有CodeMsg类?
如果没有CodeMsg类,当我们请求返回成功时,可以直接将数据传入。
@ResponseBody @GetMapping("/hello") public Result<String> hello(){ return Result.success("hello"); }
但是,如果请求失败,需要传递错误信息时,我们必须这么做。
@ResponseBody @GetMapping("/helloerror") public Result<String> helloError(){ return Result.error(new CodeMsg(777,"服务器异常")); }
这样不是不可以,只是看起来不太优雅。而且,如果项目非常大,到后期可能连你自己也不知道自己定义了多少错误码,甚至可能重复定义错误码。
如何优化呢?我们只需要在CodeMsg中定义静态的成员变量,并且给它赋上自定义的错误码和错误信息,这样不仅看上去规范了许多,而且所有的错误类型都在一个地方,方便修改和检查。
优化后:
@ResponseBody @GetMapping("/helloerror") public Result<String> helloError(){ return Result.error(CodeMsg.SERVER_ERROR); }