{
data : { // 請求數(shù)據(jù),對象或數(shù)組均可
user_id: 123,
user_name: "tutuge",
user_avatar_url: "http://tutuge.me/avatar.jpg"
...
},
msg : "done", // 請求狀態(tài)描述,調(diào)試用
code: 1001, // 業(yè)務(wù)自定義狀態(tài)碼,如Http status 200但是用戶未登錄這樣的業(yè)務(wù)代碼。
extra : { // 全局附加數(shù)據(jù),字段、內(nèi)容不定(如等級,經(jīng)驗(yàn)的變化,可以作為全局的數(shù)據(jù)存在,區(qū)別于某次請求的具體data)
type: 1,
desc: "簽到成功!"
}
}
其中,code的定義要有一套規(guī)范,如:
// Code 業(yè)務(wù)自定義狀態(tài)碼定義示例
// 授權(quán)相關(guān)
1001: 無權(quán)限訪問
1002: access_token過期
1003: unique_token無效
...
// 用戶相關(guān)
2001: 未登錄
2002: 用戶信息錯(cuò)誤
2003: 用戶不存在
// 業(yè)務(wù)1
3001: 業(yè)務(wù)1XXX
3002: 業(yè)務(wù)1XXX
// ...
實(shí)踐經(jīng)驗(yàn)
命名風(fēng)格統(tǒng)一
不管是駝峰式還是下劃線式,統(tǒng)一就好。當(dāng)然,按照目前的“大眾規(guī)范”,還是統(tǒng)一小寫加下劃線比較好。
如:user_id,user_name,user_age等。
語義清晰,遵守常用縮寫
字段的名字最好能體現(xiàn)字段的類型,遵守一些“常用”的縮寫,如:
// 字符串
user_name, task_desc, date_str, article_title, feed_content 等
// 數(shù)字
user_id, users_count, task_num, xxx_offset 等
// 日期
login_at, create_date, logout_time 等
// 布爾
is_done, is_vip, protected, can_read 等
// URL
user_avatar_url, thumb_url 等
// 數(shù)組
users, profiles, thumb_imgs 等
空值、空字段的處理
除了布爾類型的,其余的空值統(tǒng)一用null表示,客戶端保證每種字段的null可以被正常處理。
給不同類型設(shè)置默認(rèn)空值
除了null,還可以對字段設(shè)置“默認(rèn)值”,如數(shù)字就是0,字符串就是空字符串"",數(shù)組就是空數(shù)組[],對象就是空對象{},這樣有個(gè)好處就是可以避免很多客戶端(Java、OC)處理空值(Null、nil、null)產(chǎn)生的異常。但是危害就是容易語義不明。還是要根據(jù)具體業(yè)務(wù)、前后端約定而定。
參考用Runtime的手段填充任意NSObject對象的nil屬性,其實(shí)就是為對象空值統(tǒng)一設(shè)置默認(rèn)值的。
布爾boolean值的處理
各種布爾值表示方式,如:
is_login: true,
is_login: "true",
is_login: 1
is_login: "TRUE"
is_login: "YES"
由于語言本身的限制、框架的處理方式,不對布爾類型的值做限制總覺得不踏實(shí),像C、C++、Objective-C里面的布爾就是數(shù)字0和1,其它語言也都各自不一樣,還有從數(shù)據(jù)庫讀寫導(dǎo)致的布爾值類型不一致等。
所以,如果可以的話,最好一開始就對所有請求參數(shù)、結(jié)果的布爾值類型做限定,比如統(tǒng)一成數(shù)字0和1最好。