關(guān)于springboot的接口返回值統(tǒng)一標(biāo)準(zhǔn)格式_第1頁
關(guān)于springboot的接口返回值統(tǒng)一標(biāo)準(zhǔn)格式_第2頁
關(guān)于springboot的接口返回值統(tǒng)一標(biāo)準(zhǔn)格式_第3頁
關(guān)于springboot的接口返回值統(tǒng)一標(biāo)準(zhǔn)格式_第4頁
關(guān)于springboot的接口返回值統(tǒng)一標(biāo)準(zhǔn)格式_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論