版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第關(guān)于springboot的接口返回值統(tǒng)一標(biāo)準(zhǔn)格式目錄一、目標(biāo)二、為什么要對springboot的接口返回值統(tǒng)一標(biāo)準(zhǔn)格式第一種格式:response為String第二種格式:response為Objct第三種格式:response為void第四種格式:response為異常三、定義response的標(biāo)準(zhǔn)格式四、初級程序員對response代碼封裝步驟1:把標(biāo)準(zhǔn)格式轉(zhuǎn)換為代碼步驟2:把狀態(tài)碼存在枚舉類里面步驟3:加一個體驗類五、高級程序員對response代碼封裝步驟1:采用ResponseBodyAdvice技術(shù)來實現(xiàn)response的統(tǒng)一格式步驟2:寫一個ResponseBodyAdvice實現(xiàn)類第1個地方:@ControllerAdvice注解第2個地方:beforeBodyWrite方法體的response類型判斷response統(tǒng)一格式
一、目標(biāo)
弄清楚為什么要對springboot,所有Controller的response做統(tǒng)一格式封裝?學(xué)會用ResponseBodyAdvice接口和@ControllerAdvice注解
二、為什么要對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)接口,他們會很懵逼,因為你給他們的接口沒有一個統(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)值:代表本次請求response的狀態(tài)結(jié)果。
2.response描述:對本次狀態(tài)碼的描述。
3.data數(shù)據(jù):本次返回的數(shù)據(jù)。
{
"status":0,
"desc":"成功",
"data":"test"
}
四、初級程序員對response代碼封裝
對response的統(tǒng)一封裝,是有一定的技術(shù)含量的,我們先來看下,初級程序員的封裝,網(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)值:代表本次請求response的狀態(tài)結(jié)果。
*/
privateIntegerstatus;
/**
*2.response描述:對本次狀態(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錯誤*/
SYSTEM_ERROR(10000,"系統(tǒng)異常,請稍后重試"),
UNAUTHORIZED(10401,"簽名驗證失敗"),
/*參數(shù)錯誤:10001-19999*/
PARAM_IS_INVALID(10001,"參數(shù)無效"),
/*用戶錯誤: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:加一個體驗類
@Api(description="用戶接口")
@RestController
@RequestMapping("/user")
@Slf4j
publicclassUserController{
@GetMapping(value="/getResult")
publicResultgetResult(
){
returnResult.suc("test");
}
}
結(jié)論:看到這里,應(yīng)該有很多同學(xué)都知道這樣封裝代碼有很大弊端。
因為今后你每寫一個接口,都要手工指定Result.suc()這行代碼,多累啊??
如果你寫這種代碼推廣給你整個公司用,然后硬性規(guī)定代碼必須這么寫!!所有程序都會吐槽鄙視!?。?!
五、高級程序員對response代碼封裝
如果你在公司推廣你的編碼規(guī)范,為了避免被公司其他程序員吐槽和鄙視,我們必須優(yōu)化代碼。
優(yōu)化的目標(biāo):不要每個接口都手工指定Result返回值。
步驟1:采用ResponseBodyAdvice技術(shù)來實現(xiàn)response的統(tǒng)一格式
springboot提供了ResponseBodyAdvice來幫我們處理
ResponseBodyAdvice的作用:攔截Controller方法的返回值,統(tǒng)一處理返回值/響應(yīng)體,一般用來做response的統(tǒng)一格式、加解密、簽名等等。
先看下ResponseBodyAdvice這個接口的源碼。
publicinterfaceResponseBodyAdviceT{
/**
*是否支持advice功能
*treu=支持,false=不支持
*/
booleansupports(MethodParametervar1,ClassextendsHttpMessageConvertervar2);
/**
*
*處理response的具體業(yè)務(wù)方法
*/
@Nullable
TbeforeBodyWrite(@NullableTvar1,MethodParametervar2,MediaTypevar3,ClassextendsHttpMessageConvertervar4,ServerHttpRequestvar5,ServerHttpResponsevar6);
}
步驟2:寫一個ResponseBodyAdvice實現(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個地方需要重點講解:
第1個地
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 魯濱遜題目及答案100道選擇題
- 阜寧縣中考題目及答案
- 養(yǎng)老院老人健康監(jiān)測人員職業(yè)發(fā)展規(guī)劃制度
- 美團(tuán)酒店考試題目及答案
- 辦公室員工培訓(xùn)記錄與檔案制度
- 銻制品出口配額制度
- 銀行取錢用途制度
- 述責(zé)述廉評議上級文件制度
- 模擬考試怎么編程題目及答案
- 運(yùn)輸企業(yè)重大事故隱患排查治理制度
- DL∕T 612-2017 電力行業(yè)鍋爐壓力容器安全監(jiān)督規(guī)程
- 杭州中考初中英語詞匯表
- 2024年國企行測題庫
- 煙囪技術(shù)在血管腔內(nèi)修復(fù)術(shù)中的應(yīng)用
- 崗位聘用登記表
- 2023年全國統(tǒng)一高考政治試卷(新課標(biāo)ⅰ)(含解析版)
- 2023年北京高考語文答題卡(北京卷)word版可編輯kh
- 2023年高鐵信號車間副主任述職報告
- GB/T 5762-2012建材用石灰石、生石灰和熟石灰化學(xué)分析方法
- 第3章 圓錐曲線的方程【精簡思維導(dǎo)圖梳理】高考數(shù)學(xué)高效備考 人教A版2019選擇性必修第一冊
- 劉一秒演說智慧經(jīng)典(內(nèi)部筆記)
評論
0/150
提交評論