SpringBoot系列(二):如何構(gòu)建統(tǒng)一的消息響應(yīng)模型
作者:
修羅debug
版權(quán)聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 by-sa 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接和本聲明。
摘要:對于“構(gòu)建統(tǒng)一的消息響應(yīng)模型”,相信各位小伙伴在開發(fā)項(xiàng)目的過程中多少都有所遇見過,要知道,一個(gè)糟糕的接口響應(yīng)信息的規(guī)定,對于協(xié)作開發(fā)或者接口調(diào)用方的小伙伴而言將是一個(gè)小災(zāi)難,本文將介紹一種簡潔的,可用于前后端接口交互 以及 服務(wù)與服務(wù)之間進(jìn)行調(diào)用時(shí)的統(tǒng)一消息響應(yīng)模型。
內(nèi)容:接著上一篇文章的內(nèi)容,本文我們將繼續(xù)以所搭建的標(biāo)準(zhǔn)的、企業(yè)級的Spring Boot項(xiàng)目為奠基,介紹分享前后端接口交互、服務(wù)與服務(wù)之間接口交互時(shí)如何規(guī)定一個(gè)統(tǒng)一的、標(biāo)準(zhǔn)的接口響應(yīng)模型。
其實(shí),這個(gè)統(tǒng)一的接口消息響應(yīng)模型也沒有那么高大上,其實(shí)就是參考了HTTP協(xié)議的“響應(yīng)模型”而設(shè)計(jì)的一款統(tǒng)一消息響應(yīng)模型:狀態(tài)碼Code、狀態(tài)碼描述信息Msg、響應(yīng)數(shù)據(jù)Data,其對應(yīng)的源代碼如下所示:
public class BaseResponse<T> {
private Integer code;
private String msg;
private T data;
public BaseResponse(Integer code, String msg) {
this.code = code;
this.msg = msg;
}
public BaseResponse(StatusCode statusCode) {
this.code = statusCode.getCode();
this.msg = statusCode.getMsg();
}
public BaseResponse(Integer code, String msg, T data) {
this.code = code;
this.msg = msg;
this.data = data;
}
//省去getter setter方法
}
除此之外,眾所周知,我們在前端對后端相應(yīng)的接口發(fā)起請求時(shí),一般會得到相應(yīng)的響應(yīng)狀態(tài)碼,比如大家比較熟悉的200(OK)、404(Not Found)、405(Method Not Allowed)、502(Bad Gateway)、401(Unauthorized)等等,關(guān)于其他的、詳細(xì)的響應(yīng)狀態(tài)碼列表,大家可以來此看個(gè)夠:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status
觀察這些狀態(tài)碼,會發(fā)現(xiàn)其實(shí)就是由兩個(gè)字段信息組成,即Code跟Msg,因此,為了開發(fā)的方便,我們定義了包含這兩個(gè)字段的枚舉類StatusCode,其源代碼如下所示:
/**
* 通用狀態(tài)碼
*/
public enum StatusCode {
Success(0,"成功"),
Fail(-1,"失敗"),
InvalidParams(201,"非法的參數(shù)!"),
InvalidGrantType(202,"非法的授權(quán)類型");
private Integer code;
private String msg;
StatusCode(Integer code, String msg) {
this.code = code;
this.msg = msg;
}
//此處省略getter、setter方法
}
BaseResponse跟StatusCode相應(yīng)文件的存儲位置如下圖所示:
BaseResponse 加 StatusCode結(jié)合使用,可以說是風(fēng)云合璧、天下無敵??!在開發(fā)項(xiàng)目接口的功能方法時(shí),如果是需要返回相應(yīng)的數(shù)據(jù)列表而不是跳轉(zhuǎn)頁面的話,則可以采用BaseResponse作為通用的返回格式。下面就來舉個(gè)栗子吧!
在server模塊建立一個(gè)BaseController,然后開發(fā)兩個(gè)請求對應(yīng)的功能方法,如下所示:
/**
* @Author:debug (SteadyJack)
* @Date: 2019/8/24 16:07
**/
@RestController
@RequestMapping("base")
public class BaseController {
@Autowired
private IBaseService baseService;
/**
* 獲取基本的信息一
* @param name
* @return
*/
@RequestMapping(value = "/info",method = RequestMethod.GET)
public BaseResponse info(String name){
BaseResponse response=new BaseResponse(StatusCode.Success);
try {
response.setData(name);
}catch (Exception e){
response=new BaseResponse(StatusCode.Fail.getCode(),e.getMessage());
}
return response;
}
/**
*交互獲取基本的信息二
* @param id
* @return
*/
@RequestMapping(value = "/item",method = RequestMethod.GET)
public BaseResponse item(@RequestParam(required = false,defaultValue = "1") Integer id){
BaseResponse response=new BaseResponse(StatusCode.Success);
try {
response.setData(baseService.getItem(id));
}catch (Exception e){
response=new BaseResponse(StatusCode.Fail.getCode(),e.getMessage());
}
return response;
}
}
其中,baseService.getItem()方法的功能在于根據(jù)“主鍵id”獲取商品的詳情,其接口定義的方法代碼如下所示:
public interface IBaseService {
Item getItem(Integer id) throws Exception;
}
對應(yīng)的實(shí)現(xiàn)類的代碼如下所示:
/**
* @Author:debug (SteadyJack)
* @Date: 2019/8/24 17:18
**/
@Service
public class BaseServiceImpl implements IBaseService{
@Autowired
private ItemMapper itemMapper;
@Override
public Item getItem(Integer id) throws Exception {
return itemMapper.selectByPrimaryKey(id);
}
}
itemMapper的代碼就不貼了,各位小伙伴可以在文末將代碼check下來,看一下就知道了!
下面將整個(gè)項(xiàng)目跑起來,然后在postman或者瀏覽器分別發(fā)起如下的請求,將得到相應(yīng)的不同的結(jié)果。
(1)首先是:http://localhost:8081/technology/base/info?name=程序員實(shí)戰(zhàn)基地 點(diǎn)擊Enter鍵即可發(fā)起請求,得到的消息響應(yīng)結(jié)果如下所示:
(2)然后是發(fā)起:http://localhost:8081/technology/base/item?id=2 點(diǎn)擊Enter鍵即可發(fā)起請求,得到的消息響應(yīng)結(jié)果如下所示:
當(dāng)前端開發(fā)者或者其他的接口調(diào)用者調(diào)用此接口,并得到這樣的消息響應(yīng)模型時(shí),我相信對于他們而言處理起來時(shí)比較方面的,因?yàn)樗鼈兛梢愿鶕?jù)這樣的數(shù)據(jù)格式定義統(tǒng)一的類進(jìn)行接收并進(jìn)行解析!
從另外的協(xié)調(diào)開發(fā)的層面來講,這其實(shí)也有利于團(tuán)隊(duì)的高效開發(fā)、以及項(xiàng)目中代碼的管理和維護(hù)!即作為接口的開發(fā)者,只需要定義好響應(yīng)狀態(tài)碼并一股腦的把相應(yīng)的數(shù)據(jù)都塞入 data 進(jìn)去就可以了!其他的就是“接口請求方”的事情了。
補(bǔ)充:
1、本文涉及到的相關(guān)的源代碼可以到此地址,check出來進(jìn)行查看學(xué)習(xí):
https://gitee.com/steadyjack/SpringBootTechnology
2、關(guān)注一下Debug的技術(shù)微信公眾號唄,最新的技術(shù)文章、技術(shù)課程以及技術(shù)專欄將會第一時(shí)間在公眾號發(fā)布哦!