




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第關(guān)于springboot的接口返回值統(tǒng)一標(biāo)準(zhǔn)格式目錄一、目標(biāo)二、為什么要對(duì)springboot的接口返回值統(tǒng)一標(biāo)準(zhǔn)格式第一種格式:response為String第二種格式:response為Objct第三種格式:response為void第四種格式:response為異常三、定義response的標(biāo)準(zhǔn)格式四、初級(jí)程序員對(duì)response代碼封裝步驟1:把標(biāo)準(zhǔn)格式轉(zhuǎn)換為代碼步驟2:把狀態(tài)碼存在枚舉類里面步驟3:加一個(gè)體驗(yàn)類五、高級(jí)程序員對(duì)response代碼封裝步驟1:采用ResponseBodyAdvice技術(shù)來實(shí)現(xiàn)response的統(tǒng)一格式步驟2:寫一個(gè)ResponseBodyAdvice實(shí)現(xiàn)類第1個(gè)地方:@ControllerAdvice注解第2個(gè)地方:beforeBodyWrite方法體的response類型判斷response統(tǒng)一格式
一、目標(biāo)
弄清楚為什么要對(duì)springboot,所有Controller的response做統(tǒng)一格式封裝?學(xué)會(huì)用ResponseBodyAdvice接口和@ControllerAdvice注解
二、為什么要對(duì)springboot的接口返回值統(tǒng)一標(biāo)準(zhǔn)格式
我們先來看下,springboot默認(rèn)情況下的response是什么格式的
第一種格式:response為String
@GetMapping(value="/getStr")
publicString
getStr(
){
return
"test";
}
以上springboot的返回值為
第二種格式:response為Objct
@GetMapping(value="/getObject")
publicUserVO
getObject(
){
UserVOvo=newUserVO();
vo.setUsername("agan");
return
vo;
}
以上springboot的返回值為
{
"id":null,
"username":"agan",
"password":null,
"email":null,
"phone":null,
"idCard":null,
"sex":null,
"deleted":null,
"updateTime":null,
"createTime":null
}
第三種格式:response為void
@GetMapping(value="/empty")
publicvoid
empty(
){
}
以上springboot的返回值為空
第四種格式:response為異常
@GetMapping(value="/error")
publicvoid
error(
){
inti=9/0;
}
以上springboot的返回值為空
{
"timestamp":"2025-09-07T10:35:56.658+0000",
"status":500,
"error":"InternalServerError",
"message":"/byzero",
"path":"/user/error"
}
以上4種,情況,如果你和客戶端(apph5)開發(fā)人聯(lián)調(diào)接口,他們會(huì)很懵逼,因?yàn)槟憬o他們的接口沒有一個(gè)統(tǒng)一的格式,客戶端開發(fā)人員,不知道如何處理返回值。
故,我們應(yīng)該統(tǒng)一response的標(biāo)準(zhǔn)格式。
三、定義response的標(biāo)準(zhǔn)格式
一般的response的標(biāo)準(zhǔn)格式包含3部分:
1.status狀態(tài)值:代表本次請(qǐng)求response的狀態(tài)結(jié)果。
2.response描述:對(duì)本次狀態(tài)碼的描述。
3.data數(shù)據(jù):本次返回的數(shù)據(jù)。
{
"status":0,
"desc":"成功",
"data":"test"
}
四、初級(jí)程序員對(duì)response代碼封裝
對(duì)response的統(tǒng)一封裝,是有一定的技術(shù)含量的,我們先來看下,初級(jí)程序員的封裝,網(wǎng)上很多教程都是這么寫的。
步驟1:把標(biāo)準(zhǔn)格式轉(zhuǎn)換為代碼
{
"status":0,
"desc":"成功",
"data":"test"
}
把以上格式轉(zhuǎn)換為Result代碼
@AllArgsConstructor
@NoArgsConstructor
@Data
publicclassResultT{
/**
*1.status狀態(tài)值:代表本次請(qǐng)求response的狀態(tài)結(jié)果。
*/
privateIntegerstatus;
/**
*2.response描述:對(duì)本次狀態(tài)碼的描述。
*/
privateStringdesc;
/**
*3.data數(shù)據(jù):本次返回的數(shù)據(jù)。
*/
privateTdata;
/**
*成功,創(chuàng)建ResResult:沒data數(shù)據(jù)
*/
publicstaticResultsuc(){
Resultresult=newResult();
result.setResultCode(ResultCode.SUCCESS);
returnresult;
}
/**
*成功,創(chuàng)建ResResult:有data數(shù)據(jù)
*/
publicstaticResultsuc(Objectdata){
Resultresult=newResult();
result.setResultCode(ResultCode.SUCCESS);
result.setData(data);
returnresult;
}
/**
*失敗,指定status、desc
*/
publicstaticResultfail(Integerstatus,Stringdesc){
Resultresult=newResult();
result.setStatus(status);
result.setDesc(desc);
returnresult;
}
/**
*失敗,指定ResultCode枚舉
*/
publicstaticResultfail(ResultCoderesultCode){
Resultresult=newResult();
result.setResultCode(resultCode);
returnresult;
}
/**
*把ResultCode枚舉轉(zhuǎn)換為ResResult
*/
privatevoidsetResultCode(ResultCodecode){
this.status=code.code();
this.desc=code.message();
}
}
步驟2:把狀態(tài)碼存在枚舉類里面
publicenumResultCode
{
/*成功狀態(tài)碼*/
SUCCESS(0,"成功"),
/*系統(tǒng)500錯(cuò)誤*/
SYSTEM_ERROR(10000,"系統(tǒng)異常,請(qǐng)稍后重試"),
UNAUTHORIZED(10401,"簽名驗(yàn)證失敗"),
/*參數(shù)錯(cuò)誤:10001-19999*/
PARAM_IS_INVALID(10001,"參數(shù)無效"),
/*用戶錯(cuò)誤:20001-29999*/
USER_HAS_EXISTED(20001,"用戶名已存在"),
USER_NOT_FIND(20002,"用戶名不存在");
privateIntegercode;
privateStringmessage;
ResultCode(Integercode,Stringmessage){
this.code=code;
this.message=message;
}
publicIntegercode(){
returnthis.code;
}
publicStringmessage(){
returnthis.message;
}
}
步驟3:加一個(gè)體驗(yàn)類
@Api(description="用戶接口")
@RestController
@RequestMapping("/user")
@Slf4j
publicclassUserController{
@GetMapping(value="/getResult")
publicResultgetResult(
){
returnResult.suc("test");
}
}
結(jié)論:看到這里,應(yīng)該有很多同學(xué)都知道這樣封裝代碼有很大弊端。
因?yàn)榻窈竽忝繉懸粋€(gè)接口,都要手工指定Result.suc()這行代碼,多累????
如果你寫這種代碼推廣給你整個(gè)公司用,然后硬性規(guī)定代碼必須這么寫??!所有程序都會(huì)吐槽鄙視?。。?!
五、高級(jí)程序員對(duì)response代碼封裝
如果你在公司推廣你的編碼規(guī)范,為了避免被公司其他程序員吐槽和鄙視,我們必須優(yōu)化代碼。
優(yōu)化的目標(biāo):不要每個(gè)接口都手工指定Result返回值。
步驟1:采用ResponseBodyAdvice技術(shù)來實(shí)現(xiàn)response的統(tǒng)一格式
springboot提供了ResponseBodyAdvice來幫我們處理
ResponseBodyAdvice的作用:攔截Controller方法的返回值,統(tǒng)一處理返回值/響應(yīng)體,一般用來做response的統(tǒng)一格式、加解密、簽名等等。
先看下ResponseBodyAdvice這個(gè)接口的源碼。
publicinterfaceResponseBodyAdviceT{
/**
*是否支持advice功能
*treu=支持,false=不支持
*/
booleansupports(MethodParametervar1,ClassextendsHttpMessageConvertervar2);
/**
*
*處理response的具體業(yè)務(wù)方法
*/
@Nullable
TbeforeBodyWrite(@NullableTvar1,MethodParametervar2,MediaTypevar3,ClassextendsHttpMessageConvertervar4,ServerHttpRequestvar5,ServerHttpResponsevar6);
}
步驟2:寫一個(gè)ResponseBodyAdvice實(shí)現(xiàn)類
@ControllerAdvice(basePackages="com.agan.boot")
publicclassResponseHandlerimplementsResponseBodyAdviceObject{
/**
*是否支持advice功能
*treu=支持,false=不支持
*/
@Override
publicbooleansupports(MethodParametermethodParameter,ClassextendsHttpMessageConverteraClass){
returntrue;
}
/**
*
*處理response的具體業(yè)務(wù)方法
*/
@Override
publicObjectbeforeBodyWrite(Objecto,MethodParametermethodParameter,MediaTypemediaType,ClassextendsHttpMessageConverteraClass,ServerHttpRequestserverHttpRequest,ServerHttpResponseserverHttpResponse){
if(oinstanceofString){
returnJsonUtil.object2Json(Result.suc(o));
}
returnResult.suc(o);
}
}
以上代碼,有2個(gè)地方需要重點(diǎn)講解:
第1個(gè)地
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 單位工程劃分課件
- 華清宮介紹教學(xué)課件
- 廣南一中初小數(shù)學(xué)試卷
- 健康類課件小腳印
- 2025屆青海省海東市高一物理第二學(xué)期期末學(xué)業(yè)質(zhì)量監(jiān)測(cè)試題含解析
- 帶鎖起釘器項(xiàng)目投資可行性研究分析報(bào)告(2024-2030版)
- 中國蒜頭破碎機(jī)行業(yè)市場(chǎng)前景預(yù)測(cè)及投資價(jià)值評(píng)估分析報(bào)告
- 中國無人機(jī)戰(zhàn)爭(zhēng)行業(yè)市場(chǎng)前景預(yù)測(cè)及投資價(jià)值評(píng)估分析報(bào)告
- 2025年中國淡菜干行業(yè)市場(chǎng)發(fā)展現(xiàn)狀及投資規(guī)劃建議報(bào)告
- 中國甘氨膽酸行業(yè)市場(chǎng)調(diào)查報(bào)告
- 2025家居生活方式消費(fèi)趨勢(shì)洞察報(bào)告
- 2024年寧夏婦女兒童醫(yī)院招聘事業(yè)單位工作人員真題
- 國家開放大學(xué)《藥物治療學(xué)(本)》形考作業(yè)1-4參考答案
- 成都設(shè)計(jì)咨詢集團(tuán)有限公司2025年社會(huì)公開招聘(19人)筆試參考題庫附帶答案詳解
- 滅火器培訓(xùn)試題及答案
- 女性不孕癥中西醫(yī)結(jié)合診療指南
- 快遞站轉(zhuǎn)讓合同協(xié)議書范本
- 禁止黃賭毒協(xié)議書模板
- 礦泉水銷售合同協(xié)議
- 白酒質(zhì)押貸款合同協(xié)議
- 2025-2030中國大麻煙行業(yè)市場(chǎng)發(fā)展趨勢(shì)與前景展望戰(zhàn)略研究報(bào)告
評(píng)論
0/150
提交評(píng)論