接口的統一數據返回設計與實現

一、前言

在前端請求後端中,需要經常與後端進行交互,如果後端接口返回格式不統一,則會造成前端解析返回很麻煩,一旦數據發生變化,改動很大,要付出的代價很大。定義一個統一處理,可以簡化上述問題。

二、代碼

這個統一返回接口,是我以前參看慕課網的一個教程後經過實踐後改造的。這種統一返回接口在沒有數據要返回給前端時,只需要返回信息碼和提示信息即可。當有數據返回給前端展示時,可以將信息碼和返回數據統一返回,然而只需要定義一個類,不需要根據對象的不同去寫不同的返回,這主要得益於泛型。有關泛型的簡單介紹,正好昨天寫了關於泛型的筆記。泛型筆記
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即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章