一般對(duì)于接口返回狀態(tài)碼表示不同的結(jié)果,比如登陸,有些人會(huì)寫(xiě)很多個(gè)狀態(tài)碼,如:101,102,103,而有些人只寫(xiě)一個(gè),如:status為0或者1,具體例子:
只用status一個(gè)狀態(tài)碼:
// 只要登陸成功,status為1,否則都為0,具體信息放在msg里面
// 成功
{
status: 1,
msg: '登陸成功'
}
// 用戶名不存在
{
status: 0,
msg: '用戶名不存在'
}
// 密碼錯(cuò)誤
{
status: 0,
msg: '密碼錯(cuò)誤'
}
用多個(gè)狀態(tài)碼的情況可能如下:
// 成功
{
code: 200,
msg: '登陸成功'
}
// 用戶名不存在
{
code: 201,
msg: '用戶名不存在'
}
// 密碼錯(cuò)誤
{
code: 202,
msg: '密碼錯(cuò)誤'
}
顯然第二種會(huì)更麻煩,雖然更具體。大家一般都會(huì)第二種的吧,第一種的話,會(huì)有什么不合適的地方的呢?想看看大家的想法
字段 | 含義 |
---|---|
code | 服務(wù)端處理業(yè)務(wù)后的返回代碼,其中包含公共響應(yīng)代碼和當(dāng)前業(yè)務(wù)特有代碼 組成右 http_code +3位數(shù)字,成功 除外,成功使用200 表示,其他的,如客戶端請(qǐng)求權(quán)限錯(cuò)誤 401001
|
msg | 服務(wù)端處理后返回給客戶端的提示性文字,當(dāng)然,客戶端不應(yīng)該直接使用此 提示,而是根據(jù)code自定義提示語(yǔ)給用戶 |
data | 處理業(yè)務(wù)邏輯后需要返回的數(shù)據(jù),必須為一個(gè)對(duì)象,而非任何標(biāo)量值 。 |
session | 這里的session并不是傳統(tǒng)http中的session,而是單次會(huì)話的標(biāo)識(shí)符,因?yàn)樵?br>客戶端調(diào)用API的過(guò)程中,難免會(huì)遇到數(shù)據(jù)問(wèn)題,導(dǎo)致不好調(diào)試,所以應(yīng)該將 所有的請(qǐng)求記錄放進(jìn)去日志,然后當(dāng)客戶端出現(xiàn)問(wèn)題時(shí)根據(jù)請(qǐng)求的session來(lái) 定位是哪一個(gè)會(huì)話,然后使用postman對(duì)請(qǐng)求進(jìn)行重放調(diào)試,除了請(qǐng)求日志, 還應(yīng)該保存請(qǐng)求日志 |
除了業(yè)務(wù)響應(yīng)代碼,應(yīng)該還有一些公共響應(yīng)代碼
code | 示例 |
---|---|
200 | 請(qǐng)求成功 |
401001 | 用戶身份失效 |
400001 | 請(qǐng)求參數(shù)錯(cuò)誤 |
404001 | 服務(wù)沒(méi)有數(shù)據(jù) |
....
其實(shí)這個(gè)還是看團(tuán)隊(duì)吧,比如最近寫(xiě)的一個(gè)Api,我前期定義錯(cuò)誤返回碼:
$map = [
-1001 => '用戶名不存在',
-1002 => '密碼錯(cuò)誤',
-1003 => '驗(yàn)證碼錯(cuò)誤'
];
采用定義一個(gè)這樣map錯(cuò)誤碼,1 001,1代表模塊,001代表錯(cuò)誤碼。只是前臺(tái)那里只要你不是返回200(約定成功返回200),其他一律都認(rèn)定錯(cuò)誤返回碼。其實(shí)通過(guò)200(成功),-200(不成功)這種簡(jiǎn)單的也可以,因?yàn)槟阏?qǐng)求出現(xiàn)的異常錯(cuò)誤,肯定是在同一個(gè)模塊下的報(bào)錯(cuò),所以排查起來(lái)也不是很麻煩。
一些特殊的狀態(tài)碼,肯定是要約定好的。如token過(guò)期需要重新登陸
-100 => '請(qǐng)重新登陸'
這樣。
我的設(shè)計(jì)方案是:
code: 狀態(tài)碼
summary: 說(shuō)明
data: 數(shù)據(jù)
key: 參數(shù)加密
timestamp: 時(shí)間戳
nonce: 非重復(fù)隨機(jī)值
說(shuō)明:
code
:狀態(tài)碼,使用字符串
failure_password_or_account_error
,這種具有自說(shuō)明性的狀態(tài)碼,并且不容易重復(fù)success
。其他狀態(tài)碼全局唯一但是各個(gè)接口可能會(huì)出現(xiàn)相同狀態(tài)碼。do_something_1
、do_something2
等。login_status_timeout
,登錄過(guò)期......summary
:說(shuō)明,是對(duì)狀態(tài)碼的說(shuō)明,一般是中文,
failure_password_or_account_error
,前端不需要捕捉這個(gè)錯(cuò)誤,而直接提示summary
,此時(shí)sumamry
的內(nèi)容是賬戶或者密碼錯(cuò)誤
,這樣前端就不需要捕捉每個(gè)狀態(tài)碼,只需要捕捉特定的的就好了。error_yo_yo:異地登錄,請(qǐng)重新登錄
,這時(shí)候前端暫時(shí)不捕捉也沒(méi)事,畢竟默認(rèn)就把summary
提示出來(lái)了,所以用戶就會(huì)看到異地登錄,請(qǐng)重新登錄
的提示,雖然跳到登錄頁(yè)面更好,但是暫時(shí)也不影響用戶操作。data
:這是真正的數(shù)據(jù),需要的時(shí)候就返回key
:對(duì)data
的加密,用來(lái)校驗(yàn)參數(shù)是否被篡改timestamp
:時(shí)間戳,可用來(lái)加密data
入?yún)?,同時(shí)給后端校驗(yàn)nonce
:無(wú)意義隨機(jī)字符串,配合timestamp
防重放攻擊說(shuō)明:
上面的流程直接封裝成網(wǎng)絡(luò)層,配合模型層,上層的業(yè)務(wù)幾乎感覺(jué)不到這里的繁雜的東西,對(duì)上層來(lái)說(shuō),該捕捉狀態(tài)碼的時(shí)候,直接捕捉,不需要捕捉的時(shí)候,甚至都不用理會(huì)。將細(xì)節(jié)屏蔽
、擴(kuò)展能力擴(kuò)大
才是最優(yōu)的
使用經(jīng)驗(yàn):
這一套使用了大概2年,也經(jīng)過(guò)好幾次改版和迭代,橫跨了十多個(gè)項(xiàng)目,涉及原生安卓
、ios
、js
等,雖然上面有很多細(xì)節(jié)沒(méi)有說(shuō)的很清晰,但是也差不多了。
更傾向于第二種,并且也建議直接用第二種,也是系統(tǒng)優(yōu)化茁壯的必然選擇。
樓上有人說(shuō)對(duì)前端方便與否的,其實(shí)都一樣,正確狀態(tài)碼就一個(gè) 0
,1
,200
視自己習(xí)慣而定,其他都是錯(cuò)誤碼,像我習(xí)慣0
是success,其他都是異常,而對(duì)前端來(lái)說(shuō)無(wú)非是判斷是0
還是1
與判斷是0
還是非0
的區(qū)別 實(shí)在想不通這算什么麻煩?
采用第二種方案后端給出詳細(xì)錯(cuò)誤code
能使錯(cuò)誤信息更精準(zhǔn),嫌麻煩無(wú)意義的直接當(dāng)成0和1用統(tǒng)一錯(cuò)誤提示即可,也就是說(shuō)第二種方案是可以向第一種無(wú)縫兼容的。
但一但決定采用第一種方案,后端只給你一種錯(cuò)誤code
,你以后后端想改第二種的話那代碼量就可觀了
北大青鳥(niǎo)APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國(guó)IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國(guó)家
北大青鳥(niǎo)中博軟件學(xué)院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學(xué)院和江蘇省首批服務(wù)外包人才培訓(xùn)基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團(tuán)創(chuàng)建于1999年,經(jīng)過(guò)二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術(shù)與教育服務(wù)機(jī)構(gòu),發(fā)展為教育服務(wù)業(yè)的綜合性企業(yè)集團(tuán),成為集合面授教學(xué)培訓(xùn)、網(wǎng)
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國(guó)一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國(guó)成功上市,融資1
曾工作于聯(lián)想擔(dān)任系統(tǒng)開(kāi)發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_(kāi)發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫(kù),具有快速界面開(kāi)發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁(yè)制作和網(wǎng)頁(yè)游戲開(kāi)發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開(kāi)發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國(guó)Software AG 技術(shù)顧問(wèn),美國(guó)Dachieve 系統(tǒng)架構(gòu)師,美國(guó)AngelEngineers Inc. 系統(tǒng)架構(gòu)師。