JavaLib | Result讓你的API接口統一化(2)

引言

JavaLib很早就實現了Result模塊,我也一直在用,但那是針對公用API接口的,如果後端開發人員也像那樣寫API接口給前端的話,非常麻煩,所以,很早就決定要重寫了,我也是參考了很多人的,看Spring Builder模式,有點糊塗,設計算是失敗了。

概要

我們先來看一下,長什麼樣吧。

public class App {

    public static void main(String[] args) {

        // 成功,無數據,自定義返回碼和描述
        Result result1 = ResultResponseUtil.ok().code(0).msg("Success");
        // 成功,返回數據,自定義返回碼和描述
        Result result2 = ResultResponseUtil.ok().code(0).msg("Success").data("data");
        // 成功,無數據,通過enum方式存放返回碼
        Result result3 = ResultResponseUtil.ok().status(DefaultReturnCode.SUCCESS);
        // 成功,返回數據,通過enum方式存放返回碼
        Result result4 = ResultResponseUtil.ok().status(DefaultReturnCode.SUCCESS).data("data");

        // 失敗,無數據,自定義返回碼和描述
        Result result5 = ResultResponseUtil.error().code(-1).msg("Error");
        // 失敗,返回數據,自定義返回碼和描述
        Result result6 = ResultResponseUtil.error().code(-1).msg("Error").data("data");
        // 失敗,無數據,通過enum方式存放返回碼
        Result result7 = ResultResponseUtil.error().status(DefaultReturnCode.ERROR_INIT);
        // 失敗,返回數據,通過enum方式存放返回碼
        Result result8 = ResultResponseUtil.error().status(DefaultReturnCode.ERROR_INIT).data("data");

        Console.info(result1);
        Console.info(result2);
        Console.info(result3);
        Console.info(result4);
        Console.info(result5);
        Console.info(result6);
        Console.info(result7);
        Console.info(result8);
        Console.info();
        Console.info(new Gson().toJson(result1));
        Console.info(new Gson().toJson(result2));
        Console.info(new Gson().toJson(result3));
        Console.info(new Gson().toJson(result4));
        Console.info(new Gson().toJson(result5));
        Console.info(new Gson().toJson(result6));
        Console.info(new Gson().toJson(result7));
        Console.info(new Gson().toJson(result8));
    }
}

打印結果:

DefaultResult{code=0 success=true msg=Success data=null}
DefaultResult{code=0 success=true msg=Success data=data}
DefaultResult{code=0 success=true msg=Success data=null}
DefaultResult{code=0 success=true msg=Success data=data}
DefaultResult{code=-1 success=false msg=Error data=null}
DefaultResult{code=-1 success=false msg=Error data=data}
DefaultResult{code=-1 success=false msg=init... data=null}
DefaultResult{code=-1 success=false msg=init... data=data}

{"success":true,"code":0,"msg":"Success"}
{"success":true,"code":0,"msg":"Success","data":"data"}
{"success":true,"code":0,"msg":"Success"}
{"success":true,"code":0,"msg":"Success","data":"data"}
{"success":false,"code":-1,"msg":"Error"}
{"success":false,"code":-1,"msg":"Error","data":"data"}
{"success":false,"code":-1,"msg":"init..."}
{"success":false,"code":-1,"msg":"init...","data":"data"}

使用

import com.fengwenyi.javalib.result.DefaultReturnCode;
import com.fengwenyi.javalib.result.Result;
import com.fengwenyi.javalib.result.ResultResponseUtil;
import lombok.Data;
import lombok.experimental.Accessors;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class ApiResultApplication {

    public static void main(String[] args) {
        SpringApplication.run(ApiResultApplication.class, args);
    }

    /**
     * 獲取所有用戶數據
     * @return (json)
     */
    @GetMapping("/getUsers")
    public Result getUsers() {

        User user1 = new User().setName("馮文議").setAge(26).setGender("男");
        User user2 = new User().setName("張三").setAge(25).setGender("女");
        User user3 = new User().setName("李四").setAge(23).setGender("保密");
        User user4 = new User().setName("王五").setAge(20).setGender("未知");

        User [] users = {user1, user2, user3, user4};

        return ResultResponseUtil.ok().status(DefaultReturnCode.SUCCESS).data(users);

    }
}

@Data
@Accessors(chain = true)
class User {

    // 姓名
    private String name;
    // 年齡
    private Integer age;
    // 性別
    private String gender;


}

結果(已格式化):

{
    "code":0,
    "msg":"Success",
    "data":[
        {
            "name":"馮文議",
            "age":26,
            "gender":"男"
        },
        {
            "name":"張三",
            "age":25,
            "gender":"女"
        },
        {
            "name":"李四",
            "age":23,
            "gender":"保密"
        },
        {
            "name":"王五",
            "age":20,
            "gender":"未知"
        }
    ],
    "success":true
}

這樣存在一個問題,也是上個版本有的,我們修改一下代碼:

//return ResultResponseUtil.ok().status(DefaultReturnCode.SUCCESS).data(users);
return ResultResponseUtil.ok().code(0).data(users);

看結果:

API返回值存在null

API返回值存在 null,相信你一定遇到了這個問題,那我們怎麼避免這個問題呢?網上有很多解決辦法,我想說的是,我們還是應該按規則來寫,寫全寫完整。

我們再來看看另外一種處理方式:

    @GetMapping("/getUsers2")
    public String getUsers2() {

        User user1 = new User().setName("馮文議").setAge(26).setGender("男");
        User user2 = new User().setName("張三").setAge(25).setGender("女");
        User user3 = new User().setName("李四").setAge(23).setGender("保密");
        User user4 = new User().setName("王五").setAge(20).setGender("未知");

        User [] users = {user1, user2, user3, user4};

        Result result = ResultResponseUtil
                .ok()
                .status(DefaultReturnCode.SUCCESS)
                .data(users);
        
        return new Gson().toJson(result);

    }

寫公用接口的時候,我們一定要注意,避免所有的不必要。

資料

【1】 JavaLib

【2】 JavaLib Result模塊測試代碼

【3】 SpringMVC返回結果的封裝

【4】 JavaLib | result 模塊

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