寫在前面的話
這篇文章計(jì)劃是在過年期間完成的,示例代碼都寫好了,結(jié)果親戚來我家做客,文章沒來得及寫。已經(jīng)很久沒有更新文章了,小伙伴們,有沒有想我啊。言歸正傳,下面開始,今天的話題。
目標(biāo)
寫一套符合規(guī)范,并且具有RESTful風(fēng)格的API接口。
假定
你已會(huì)使用Spring Boot 2.x。
你已會(huì)使用Gradle構(gòu)建Spring Boot工程。
你已會(huì)基于Spring Boot編寫API接口。
你已會(huì)使用接口調(diào)試工具。
如果你還不會(huì)使用Spring Boot寫接口,建議先看一下這篇文章 :
步驟
1、基于Gradle構(gòu)建Spring Boot示例項(xiàng)目。
2、引入JavaLib。
3、編寫接口代碼。
4、測試接口。
引入JavaLib
測試版(SNAPSHOT),都會(huì)發(fā)布到 JitPack 上,所以,從這里拉取的,都會(huì)是最新的,但是需要配置倉庫地址。
正式版(RELEASE),才會(huì)推送到 Maven中央。
UserModel
我們用UserModel來存放我們的數(shù)據(jù),以便存取。我個(gè)人比較喜歡用bean的,如果你喜歡用Map,那也是可以的。不過需要注意的是,
需要加@JsonInclude(JsonInclude.Include.NON_NULL) ,他的作用是,如果某個(gè)字段為空時(shí),在返回的JSON中,則不顯示,如果沒有,將為 null。
完整代碼如下:
package com.fengwenyi.demojavalibresult.model;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* User Model
* @author Wenyi Feng
* @since 2019-02-05
*/
@Data
@Accessors(chain = true)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class UserModel implements Serializable {
private static final long serialVersionUID = -835481508750383832L;
/** UID */
private String uid;
/** Name */
private String name;
/** Age */
private Integer age;
}
編寫接口返回碼
這里我們使用 JavaLib 中result模塊為我們提供的方法。只需要調(diào)用 BaseCodeMsg.app(Integer, String)即可。這里我們只寫幾個(gè)用作示例,完整代碼如下:
package com.fengwenyi.demojavalibresult.util;
import com.fengwenyi.javalib.result.BaseCodeMsg;
/**
* 自定義返回碼以及描述信息
* @author Wenyi Feng
* @since 2019-02-05
*/
public class CodeMsg {
/*
user error
------------------------------------------------------------------------------------------------------------*/
/** 用戶不存在 */
public static final BaseCodeMsg ERROR_USER_NOT_EXIST = BaseCodeMsg.app(10001, "User Not Exist");
/** UID不能為空 */
public static final BaseCodeMsg ERROR_USER_UID_NOT_NULL = BaseCodeMsg.app(10002, "User UID Must Not null");
}
BaseCodeMsg
我們看一下源碼:
package com.fengwenyi.javalib.result;
/**
* (基類)返回碼及描述信息
* @author Wenyi Feng
* @since 2019-01-22
*/
public class BaseCodeMsg {
/** 返回碼 */
private Integer code;
/** 返回碼描述 */
private String msg;
/**
* 無參數(shù)構(gòu)造方法
*/
private BaseCodeMsg() {}
/**
* 構(gòu)造方法
* @param code
* @param msg
*/
private BaseCodeMsg(Integer code, String msg) {
this.code = code;
this.msg = msg;
}
public static BaseCodeMsg app(Integer code, String msg) {
return new BaseCodeMsg(code, msg);
}
/**
* 返回碼填充
* @param args 填充內(nèi)容
* @return CodeMsgEnum
*/
public BaseCodeMsg fillArgs(Object ... args) {
this.msg = String.format(this.msg, args);
return this;
}
/**
* 獲取返回碼
* @return 返回碼
*/
public Integer getCode() {
return code;
}
/**
* 獲取描述信息
* @return 描述信息
*/
public String getMsg() {
return msg;
}
/** 成功 */
public static final BaseCodeMsg SUCCESS = BaseCodeMsg.app(0, "Success");
/** 失敗 */
public static final BaseCodeMsg ERROR_INIT = BaseCodeMsg.app(-1, "Error");
}
成功的標(biāo)識是:當(dāng) code=0 時(shí)。
另外,我們還為你提供了預(yù)留字符串替換的方法。比如你想告訴用戶某個(gè)字段不合法,那么你可以這樣:
第一步:在CodeMsg中添加
public static final BaseCodeMsg ERROR_PARAM_ILLEGAL = BaseCodeMsg.app(20001, "Request Param Illegal : %s");
第二步:返回
/**
* 測試參數(shù)錯(cuò)誤
* @return {@link Result}
*/
@GetMapping("/test-param-error")
public Result testParamError() {
return Result.error(CodeMsg.ERROR_PARAM_ILLEGAL.fillArgs("account"));
}
測試結(jié)果:

編寫接口代碼
接下來,開始編寫我們的接口代碼。
首先指明,我們的接口接收和返回的文檔格式。
consumes = MediaType.APPLICATION_JSON_UTF8_VALUE
produces = MediaType.APPLICATION_JSON_UTF8_VALUE
再使用 JavaLib 中 Result。完整代碼如下:
package com.fengwenyi.demojavalibresult.controller;
import com.fengwenyi.demojavalibresult.model.UserModel;
import com.fengwenyi.demojavalibresult.util.CodeMsg;
import com.fengwenyi.javalib.result.Result;
import org.springframework.http.MediaType;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
/**
* User Controller : 用戶操作
* @author Wenyi Feng
* @since 2019-02-05
*/
@RestController
@RequestMapping(value = "/user",
consumes = MediaType.APPLICATION_JSON_UTF8_VALUE,
produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public class UserController {
/** 臨時(shí)存放用戶信息 */
private List<UserModel> userModelList = new ArrayList<>();
/**
* 初始化用戶
*/
@PostConstruct
public void init() {
for (int i = 0; i < 10; i++)
userModelList.add(new UserModel().setUid(UUID.randomUUID().toString()).setName("u" + i).setAge(10 + i));
}
/**
* 查詢用戶列表
* @return {@link Result}
*/
@GetMapping("/list")
public Result list() {
return Result.success(userModelList);
}
/**
* 添加用戶
* @param userModel 這里傳JSON字符串
* @return {@link Result}
*/
@PostMapping("/add")
public Result add(@RequestBody UserModel userModel) {
if (userModel != null) {
userModelList.add(userModel.setUid(UUID.randomUUID().toString()));
return Result.success();
}
return Result.error();
}
/**
* 根據(jù)UID獲取用戶
* @param uid UID
* @return {@link Result}
*/
@GetMapping("/get/{uid}")
public Result getByUid(@PathVariable("uid") String uid) {
if (StringUtils.isEmpty(uid))
return Result.error(CodeMsg.ERROR_USER_UID_NOT_NULL);
for (UserModel userModel : userModelList)
if (userModel.getUid().equals(uid))
return Result.success(userModel);
return Result.error(CodeMsg.ERROR_USER_NOT_EXIST);
}
}
測試
1、啟動(dòng)

2、list
訪問:http://localhost:8080/user/list
{
"code": 0,
"msg": "Success",
"data": [
{
"uid": "d8e2dfac-b6e8-46c7-9d43-5bb6bf99ce30",
"name": "u0",
"age": 10
},
{
"uid": "87001637-9f21-4bc7-b589-bea1b2c795c4",
"name": "u1",
"age": 11
},
{
"uid": "5e1398ca-8322-4a68-b0d2-1eb4c1cac9de",
"name": "u2",
"age": 12
},
{
"uid": "e6ee5452-4148-4f6d-b820-9cc24e5c91b5",
"name": "u3",
"age": 13
},
{
"uid": "3f428e26-57e1-4661-8275-ce3777b5da54",
"name": "u4",
"age": 14
},
{
"uid": "b9d994b4-f090-40de-b0f3-e89c613061f2",
"name": "u5",
"age": 15
},
{
"uid": "748d1349-5978-4746-b0c1-949eb5613a28",
"name": "u6",
"age": 16
},
{
"uid": "abaadb7c-23fb-4297-a531-0c490927f6d5",
"name": "u7",
"age": 17
},
{
"uid": "5e5917a1-8674-4367-94c6-6a3fd10a08d6",
"name": "u8",
"age": 18
},
{
"uid": "03ed6a83-0cc0-4714-9d0d-f653ebb3a2eb",
"name": "u9",
"age": 19
}
]
}
2、添加數(shù)據(jù)

看一下,數(shù)據(jù)是什么樣子

與我們預(yù)想的結(jié)果一樣。
獲取數(shù)據(jù)
有數(shù)據(jù)樣式:

無數(shù)據(jù)樣式:

關(guān)于
馮文議。
2017年畢業(yè)于阿壩師范學(xué)院計(jì)算機(jī)應(yīng)用專業(yè)。
現(xiàn)就職于深圳警圣技術(shù)股份有限公司,主要負(fù)責(zé)服務(wù)器接口開發(fā)工作。
技術(shù)方向:Java。
開源軟件:JavaLib。
后記
到這里就結(jié)束了,如果在遇到什么問題,或者有不明白的地方,可以通過評論、留言或者私信等方式,告訴我。