接口定義

1.常見問題

1. 返回格式不統(tǒng)一

同一個接口,有時候返回數(shù)組套像,有時候返回單個衣撬;成功的時候返回對象乖订,失敗的時候返回錯誤信息字符串。工作中有個系統(tǒng)集成就是這樣定義的接口具练,真是辣眼睛乍构。這個對應(yīng)代碼上,返回的類型是map扛点,json哥遮,object,都是不應(yīng)該的陵究。實際工作中眠饮,我們會定義一個統(tǒng)一的格式,就是ResultBean铜邮,分頁的有另外一個PageResultBean

錯誤范例:

//返回map可讀性不好仪召,盡量不要

@PostMapping("/delete")

publicMapdelete(longid,Stringlang){

}

// 成功返回boolean寨蹋,失敗返回string,大忌

@PostMapping("/delete")

publicObject delete(longid,Stringlang){

try{

boolean result=configService.delete(id,local);

return result;

}catch(Exceptione){

log.error(e);

returne.toString();

}

}

2. 沒有考慮失敗情況

一開始只考慮成功場景扔茅,等后面測試發(fā)現(xiàn)有錯誤情況已旧,怎么辦,改接口唄咖摹,前后臺都改评姨,勞民傷財無用功。

錯誤范例:

//不返回任何數(shù)據(jù)萤晴,沒有考慮失敗場景吐句,容易返工

@PostMapping("/update")

public void update(longid,xxx){

}

3. 出現(xiàn)和業(yè)務(wù)無關(guān)的輸入?yún)?shù)

如lang語言,當(dāng)前用戶信息 都不應(yīng)該出現(xiàn)參數(shù)里面店读,應(yīng)該從當(dāng)前會話里面獲取嗦枢。后面講ThreadLocal會說到怎么樣去掉。除了代碼可讀性不好問題外屯断,尤其是參數(shù)出現(xiàn)當(dāng)前用戶信息的文虏,這是個嚴(yán)重問題。

錯誤范例:

// (當(dāng)前用戶刪除數(shù)據(jù))參數(shù)出現(xiàn)lang和userid殖演,尤其是userid氧秘,大忌

@PostMapping("/delete")

public Map?delete(longid,Stringlang,StringuserId){

}

4. 出現(xiàn)復(fù)雜的輸入?yún)?shù)

一般情況下,不允許出現(xiàn)例如json字符串這樣的參數(shù)趴久,這種參數(shù)可讀性極差丸相。應(yīng)該定義對應(yīng)的bean。

錯誤范例:

// 參數(shù)出現(xiàn)json格式彼棍,可讀性不好灭忠,代碼也難看

@PostMapping("/update")

public Map?update(longid,StringjsonStr){

}

5. 沒有返回應(yīng)該返回的數(shù)據(jù)

例如,新增接口一般情況下應(yīng)該返回新對象的id標(biāo)識座硕,這需要編程經(jīng)驗弛作。新手定義的時候因為前臺沒有用就不返回數(shù)據(jù)或者只返回true,這都是不恰當(dāng)?shù)幕摇e人要不要是別人的事情映琳,你該返回的還是應(yīng)該返回。

錯誤范例:

// 約定俗成蜘拉,新建應(yīng)該返回新對象的信息刊头,只返回boolean容易導(dǎo)致返工

@PostMapping("/add")

public booleanadd(xxx){

//xxx

return configService.add();

}

@Data

public class ResultBean?implements Serializable{

private static final longserialVersionUID=1L;

public static final int SUCCESS=0;

publics tatic final int FAIL=1;

public static final int NO_PERMISSION=2;

private String msg="success";

private int code=SUCCESS;

privateT data;

public ResultBean(){

super();

}

public Result Bean(T data){

super();

this.data=data;

}

public Result Bean(Throwablee){

super();

this.msg=e.toString();

this.code=FAIL;

}

}

2.Controller規(guī)范

Controller規(guī)范,主要的內(nèi)容是就是接口定義里面的內(nèi)容诸尽,你只要遵循里面的規(guī)范原杂,controller就問題不大,除了這些您机,還有另外的幾點:

所有函數(shù)返回統(tǒng)一的ResultBean/PageResultBean格式

原因沒有統(tǒng)一格式穿肄,AOP無法玩年局。

ResultBean/PageResultBean是controller專用的,不允許往后傳咸产!

Controller做參數(shù)格式的轉(zhuǎn)換矢否,不允許把json,map這類對象傳到services去脑溢,也不允許services返回json僵朗、map。

一般情況下屑彻!寫過代碼都知道验庙,map,json這種格式靈活社牲,但是可讀性差粪薛,如果放業(yè)務(wù)數(shù)據(jù),每次閱讀起來都比較困難搏恤。定義一個bean看著工作量多了违寿,但代碼清晰多了。

參數(shù)中一般情況不允許出現(xiàn)Request熟空,Response這些對象

主要是可讀性問題藤巢。一般情況下。

不需要打印日志

日志在AOP里面會打印息罗,而且我的建議是大部分日志在Services這層打印掂咒。

規(guī)范里面大部分是 不要做的項多,要做的比較少阱当,落地比較容易俏扩。

ResultBean定義帶泛型糜工,使用了lombok弊添。

AOP代碼,主要就是打印日志和捕獲異常捌木,異常要區(qū)分已知異常和未知異常油坝,其中未知的異常是我們重點關(guān)注的,可以做一些郵件通知啥的刨裆,已知異吵喝Γ可以再細(xì)分一下,可以不同的異常返回不同的返回碼:

public class ControllerAOP{

private static final Loggerlogger=LoggerFactory.getLogger(ControllerAOP.class);

public Object handlerControllerMethod(ProceedingJoinPointpjp){

longstartTime=System.currentTimeMillis();

ResultBean?result;

try{

result=(ResultBean)pjp.proceed();

logger.info(pjp.getSignature()+"use time:"+(System.currentTimeMillis()-startTime));

}catch(Throwablee){

result=handlerException(pjp,e);

}

returnresult;

}

private ResultBean?handlerException(ProceedingJoinPointpjp,Throwablee){

Result Beanresult=newResultBean();

// 已知異常

if(e instanceof CheckException){

result.setMsg(e.getLocalizedMessage());

result.setCode(ResultBean.FAIL);

}else{

logger.error(pjp.getSignature()+" error ",e);

result.setMsg(e.toString());

result.setCode(ResultBean.FAIL);

// 未知異常是應(yīng)該重點關(guān)注的帆啃,這里可以做其他操作瞬女,如通知郵件,單獨寫到某個文件等等努潘。

}

return result;

}

}

AOP配置:(關(guān)于用java代碼還是xml配置诽偷,這里我傾向于xml配置坤学,因為這個會不定期改動)

現(xiàn)在知道為什么要返回統(tǒng)一的一個ResultBean了:

為了統(tǒng)一格式

為了應(yīng)用AOP

為了包裝異常信息

分頁的PageResultBean大同小異异袄,大家自己依葫蘆畫瓢自己完成就好了抹腿。

貼一個簡單的controller(左邊的箭頭表示AOP攔截了)。請對比程序員你為什么這么累池充?里面原來的代碼查看眠冈,沒有對比就沒有傷害飞苇。

最后說一句,先有統(tǒng)一的接口定義規(guī)范蜗顽,然后有AOP實現(xiàn)布卡。先有思想再有技術(shù)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末诫舅,一起剝皮案震驚了整個濱河市羽利,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌刊懈,老刑警劉巖这弧,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異虚汛,居然都是意外死亡匾浪,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門卷哩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蛋辈,“玉大人,你說我怎么就攤上這事将谊±淙埽” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵尊浓,是天一觀的道長逞频。 經(jīng)常有香客問我,道長栋齿,這世上最難降的妖魔是什么苗胀? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮瓦堵,結(jié)果婚禮上基协,老公的妹妹穿的比我還像新娘。我一直安慰自己菇用,他們只是感情好澜驮,可當(dāng)我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著惋鸥,像睡著了一般杂穷。 火紅的嫁衣襯著肌膚如雪鹅龄。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天亭畜,我揣著相機與錄音扮休,去河邊找鬼。 笑死拴鸵,一個胖子當(dāng)著我的面吹牛玷坠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播劲藐,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼八堡,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了聘芜?” 一聲冷哼從身側(cè)響起兄渺,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎汰现,沒想到半個月后挂谍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡瞎饲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年口叙,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嗅战。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡妄田,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出驮捍,到底是詐尸還是另有隱情疟呐,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布东且,位于F島的核電站启具,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏苇倡。R本人自食惡果不足惜富纸,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一囤踩、第九天 我趴在偏房一處隱蔽的房頂上張望旨椒。 院中可真熱鬧,春花似錦堵漱、人聲如沸综慎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽示惊。三九已至好港,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間米罚,已是汗流浹背钧汹。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留录择,地道東北人拔莱。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像隘竭,于是被迫代替她去往敵國和親塘秦。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理动看,服務(wù)發(fā)現(xiàn)尊剔,斷路器,智...
    卡卡羅2017閱讀 134,654評論 18 139
  • 工作中菱皆,少不了要定義各種接口须误,系統(tǒng)集成要定義接口,前后臺掉調(diào)用也要定義接口仇轻。接口定義一定程度上能反應(yīng)程序員的編程功...
    丁慶華閱讀 5,063評論 0 1
  • 接口定義備忘錄 接口規(guī)范的意義 接口是用于數(shù)據(jù)的交互霹期,接口文檔是供需雙方的開發(fā)規(guī)范。移動應(yīng)用接口是移動設(shè)備和業(yè)務(wù)之...
    山那邊的大叔閱讀 5,239評論 6 14
  • APP接口設(shè)計規(guī)范:效率拯田、安全历造、版本兼容、面向?qū)ο笤O(shè)計船庇、數(shù)據(jù)格式j(luò)son吭产、服務(wù)器端異常處理、https協(xié)議鸭轮; 1臣淤,...
    域星_153c閱讀 887評論 0 4
  • 本書是一本教人們?nèi)绾闻c人和諧溝通的工具書,作者從心理學(xué)角度出發(fā)窃爷,說明了人們在溝通中產(chǎn)生暴力語言的原因是什么邑蒋,以及非...
    余溫未減閱讀 413評論 0 0