一、前言
在前端請求後端中,需要經常與後端進行交互,如果後端接口返回格式不統一,則會造成前端解析返回很麻煩,一旦數據發生變化,改動很大,要付出的代價很大。定義一個統一處理,可以簡化上述問題。
二、代碼
這個統一返回接口,是我以前參看慕課網的一個教程後經過實踐後改造的。這種統一返回接口在沒有數據要返回給前端時,只需要返回信息碼和提示信息即可。當有數據返回給前端展示時,可以將信息碼和返回數據統一返回,然而只需要定義一個類,不需要根據對象的不同去寫不同的返回,這主要得益於泛型。有關泛型的簡單介紹,正好昨天寫了關於泛型的筆記。泛型筆記
1)Result類
package com.zlc.pojo;
/**
* @param <T>
* @Name:Result
* @Description:封裝統一返回結果類
* @Author: 追到烏雲的盡頭找太陽(Jacob)
* @Version: V1.00 (版本號)
* @Create Date: 2017年5月1日上午10:29:36
* @Parameters:
* @Return:
*/
public class Result<T> {
private Integer code; // 信息碼
private String msg; // 提示信息
private String url; // 請求路徑
private T data; // 數據內容
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
@Override
public String toString() {
return "Result [code=" + code + ", msg=" + msg + ", url=" + url
+ ", data=" + data + "]";
}
}
2)ResultUtil類
package com.zlc.util;
import com.zlc.pojo.Result;
/**
* @param :
* @Author : 追到烏雲的盡頭找太陽(Jacob)
* @Description : 數據統一返回結構工具
* @Date :create in 11:10 2017/3/22
*/
@SuppressWarnings({ "rawtypes", "unchecked" } )
public class ResultUtil {
public static Result success(Object object){
Result result = new Result();
result.setCode(0);
result.setMsg("成功");
result.setData(object);
return result;
}
public static Result success(){
return success(null);
}
public static Result error(Integer code, String msg){
Result result = new Result();
result.setCode(code);
result.setMsg(msg);
return result;
}
}
3)返回結構枚舉類ResultEnum
package com.zlc.enumeration;
/**
* @Name:ResultEnum
* @Description: 用於統一返回結果的枚舉類
* @Author: 追到烏雲的盡頭找太陽(Jacob)
* @Version: V1.00 (版本號)
* @Create Date: 2017年5月1日上午10:50:25
* @Parameters:
* @Return:
*/
public enum ResultEnum {
UNKONW_ERROR(-1,"未知的錯誤"),
SUCCESS(0,"成功"),
FAIL(1,"失敗"),
EXIST(2,"存在"),
NOTEXIST(3,"不存在"),
NAMEILLEGOL(10,"姓名不合法"),
PHONEILLEGOL(11,"電話號碼不合法"),
QQEILLEGOL(12,"QQ號碼不合法"),
SEXEILLEGOL(13,"性別不合法"),
PRIMARY_SCHOOL(100,"你可能在上小學"),
MIDDLE_SCHOOL(101,"你可能在上初中"),
;
private Integer code;
private String msg;
ResultEnum(Integer code, String msg) {
this.code = code;
this.msg = msg;
}
public Integer getCode() {
return code;
}
public String getMsg() {
return msg;
}
}
這個枚舉類裏面預定義的應該是大面,我上面的只是舉例。
4)無返回數據的統一返回示例
@SuppressWarnings("unchecked")
@GetMapping(value="/test")
public Result<String> test(){
// 一些邏輯判斷 if()...else....
// 如果成功,返回
return ResultUtil.success();
// 如果失敗,返回,可以直接輸入返回碼和提示信息,也可以使用枚舉類中預定義的
return ResultUtil.error(1,"你沒有權限");
}
5)有返回數據的統一返回示例
@SuppressWarnings("unchecked")
@PostMapping(value="/testData/{id}")
public Result<Student> test(@PathVariable Integere id){
// 比如說根據id拿到某個學生的個人信息,
//當然也可以根據id獲取教師信息,這時將Result<Student>改爲Result<Teachere>
// 如果成功,返回
Student queryStudent = studentService.findById(id);
if(null != queryStudent){
return ResultUtil.success(queryStudent);
}else {
return ResultUtil.error(1,"抱歉,沒有該學生哦");
}
}
三、說明
上述代碼只是簡單的示例,其實一般簡單的返回中是沒有問題的,但是如果說要返回那種類似報文的數據格式,就是說有報文頭(因爲可能含有權限信息)和報文體(含有 數據)這個時候,上面的代碼需要大改,但是基本思路是一樣的,需要根據具體去修改。
缺點2就是返回中沒有給個時間戳,這個好改,直接在Result類中,添加一個字段即可,然後在ResultUtil的success和error方法中設置LocalDateTime即可。