1. 程式人生 > >java實現json格式的狀態碼資料

java實現json格式的狀態碼資料

功能

編寫一個返回格式是json格式的資料,並且此資料是狀態碼的資料。例如:

{“code”:200,”message”:”成功”,”date”:1504785964984}

技術與IDE

spring boot
IntelliJ IDEA

程式碼參考github:

程式碼片段

1. 建立狀態碼的類 – StatusCode

StatusCode .java

package com.yubai.jsonstatus.model;

/**
 * 功能:輸出的json欄位的值是StatusCode類決定
 *      就是說返回狀態的值是成功200還是失敗400還是錯誤404,這些值
 *      是StatusCode這個類定義的。
 */
public enum StatusCode { /** 成功 */ SUCCESS(200, "成功"), /** 沒有登入 */ NOT_LOGIN(400, "沒有登入"), /** 發生異常 */ EXCEPTION(401, "發生異常"), /** 系統錯誤 */ SYS_ERROR(402, "系統錯誤"), /** 引數錯誤 */ PARAMS_ERROR(403, "引數錯誤 "), /** 不支援或已經廢棄 */ NOT_SUPPORTED(410, "不支援或已經廢棄"), /** AuthCode錯誤 */
INVALID_AUTHCODE(444, "無效的AuthCode"), /** 太頻繁的呼叫 */ TOO_FREQUENT(445, "太頻繁的呼叫"), /** 未知的錯誤 */ UNKNOWN_ERROR(499, "未知錯誤"); private int code; private String message; StatusCode(int code, String message) { this.code = code; this.message = message; } public
int getCode() { return code; } public void setCode(int code) { this.code = code; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } }

2. 建立返回json格式的類 – JsonResult

package com.yubai.swaggerrestfulapi;
/**
 * 這個類定義了返回的json格式,即json含有哪些欄位
 */
public class JsonResult {
    private String code;
    private String message;
    private Object data;

    public JsonResult(String code, String message, Object data) {
        this.code = code;
        this.message = message;
        this.data = data;
    }

    public String getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }

    public Object getData() {
        return data;
    }
}

3. 編寫登陸頁面的類 – LoginController

AdminController .java

package com.yubai.jsonstatus.controller;

import com.yubai.jsonstatus.model.JsonResult;
import com.yubai.jsonstatus.model.StatusCode;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Date;
import java.util.Map;

/**
 * 功能: 這是決定url的路勁,和判斷是否可以登陸成功的邏輯
 */
@RestController
@RequestMapping(value = "/login")
public class LoginController {
    private String username = "admin";
    private String password = "123";

    /**
     * @apiNote login
     * @param maps 儲存username password
     * @return JsonResult
     */
    @RequestMapping(value = "")
    public JsonResult login(HttpServletRequest request, HttpServletResponse response, @RequestParam Map<Integer, String> maps) {
        if (maps.get("username").equals(username) && maps.get("password").equals(password)) {
            return new JsonResult(StatusCode.SUCCESS.getCode(), StatusCode.SUCCESS.getMessage(), new Date());
        } else {
            return new JsonResult(StatusCode.NOT_LOGIN.getCode(), StatusCode.NOT_LOGIN.getMessage(), new Date());
        }
    }
}

4. 編寫啟動程式JsonStatusApplication

package com.yubai.swaggerrestfulapi;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class JsonStatusApplication{

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

瀏覽器中訪問url:

返回結果:

這裡寫圖片描述

如果不建立JsonResult會是什麼效果

程式碼塊(修改LoginController.java)

LoginController .java

package com.yubai.jsonstatus.controller;

import com.yubai.jsonstatus.model.JsonResult;
import com.yubai.jsonstatus.model.StatusCode;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Date;
import java.util.Map;

/**
 * 功能: 這是決定url的路勁,和判斷是否可以登陸成功的邏輯
 */
@RestController
@RequestMapping(value = "/login")
public class LoginController {
    private String username = "admin";
    private String password = "123";

    /**
     * @param maps 儲存username password
     * @return JsonResult
     * @apiNote login
     */
    @RequestMapping(value = "")
    public JsonResult login() {
        if ("admin".equals(username) && "123".equals(password)) {
            return new JsonResult(200, "成功", new Date());
        } else {
            return new JsonResult(400, "失敗", new Date());
        }
    }
}

比較建立JsonResult,會更靈活,擴充套件性更好。

因為當我們想要修改返回的code200/404/400或者message成功/失敗資訊時,需要修改多處使用到的地方。而我們定義JsonResult後,只需要在一個地方修改就可以修改所有的值

提高程式碼的質量

建議我們的程式碼具有靈活性,不要寫固定的程式碼。

就是說能用變數代替的不要用常量

思路:1. 直接建立變數,2. 建立類/列舉…

第一種直接建立變數

example:
需求: 在20個檔案中使用System.out.println(“我是白玉”); 當需求改變,修改我是白玉為“我是趙雅芝”,此時有兩種方法解決

方法一: 把20個檔案中的我是白玉逐一修改成我是趙雅芝。

方法二: 定義變數String name = “我是白玉”,在20個檔案中使用,當需要修改name的值時,直接修改name = ”我是趙雅芝“

兩種方法比較: 顯然第二種方法靈活性更好,只需要改動一個地方就可以改變所有使用的地方。第一種顯然比較笨拙,不建議採用

第二種直接建立類/列舉…

本例的JsonResult代替寫成固定的code200和message成功。顯然建立JsonResult這個列舉更靈活。

Junit測試類

詳情請見程式碼參考github