開發多年,遇到的後臺有不少,不一樣的人寫的代碼風格不同,寫出來的接口也不同。下面就請求失敗的接口舉個例子,讓你們看看有哪些奇葩的接口。反正我看的想打人了有木有?前端
大哥,你這是要幹啥呢。。。沒有錯誤信息,我怎麼知道請求成功仍是失敗。。這是在挑戰個人智商嗎? (建議:下次遇到這樣的,直接揍一頓,就說是我說的。下面這張圖送給大家後臺吧。)java
以下所示:編程
{
1:"123",
2:"456",
3:"789"
}
複製代碼
{
"result":""
}
複製代碼
然而:你給我返回的null
什麼意思。。。還不如不返回。。。這樣設計有啥意義。。json
{
"data":"null"
}
複製代碼
然而:錯誤數據返回null
不說,錯誤信息竟然返回一個一個url?就這麼一點錯誤信息,還要我再去請求一次服務器獲取這個錯誤信息嗎。。 服務器流量不要錢的吧。。。經得起這樣折騰?後臺哥們啊,走點心吧!爲老闆省點流量錢吧,同時也要提升用戶體驗啊!用戶請求網絡的流量也不能由你這樣去折騰。。後端
{
"data":"null",
"desc":"/error/desc"
}
複製代碼
/
轉義字符?{
"error":"//error_desc"
}
複製代碼
unicode
轉換的?我用的時候要把它轉換回來。。很麻煩。。{
"error":"/%2F%E9%94%99%E8%AF%AF%E4%BF%A1%E6%81%AF"
}
複製代碼
{
"cuowuma": 1,
"cuowuxinxi":"請求失敗"
}
複製代碼
問題:json裏面某些字段是java的關鍵字,轉成實體類的時候,會報錯。bash
{
"abstract": "Success",
"id": "503",
"package": "50"
}
複製代碼
轉成實體類以下,會報錯:服務器
public class ResultEntity {
private String abstract;
private String id;
private String package;
//...get set方法省略
}
複製代碼
- 對老司機來講,這種小問題固然也是有解決辦法的。使用google提供的序列化工具,按下面這樣寫,就能夠正常的將數據反射到字段中了。
public class ResultEntity {
@SerializedName("abstract")
private String successInfo;
private String id;
@SerializedName("package")
private String packageNumber;
//...get set方法省略
}
複製代碼
- tips:按java編程規範來講,接口中是不能包含java關鍵字的。因此 奉勸各位
後臺新手
不要心存僥倖心理,一切都要按規範來作,這樣對你從此的開發會有不少幫助。
好比下面這個,id字段,前面的是數字類型(咱們這邊暫定爲int類型),最後一個是String類型,後臺說是GUID,無論它是什麼鬼,看到這種只想打人。萬一哪天服務器把id都改爲int類型了,客戶端這邊的代碼中涉及到這個id字段的全部地方都要跟着改動,這不是坑爹嗎。。。restful
[
{
"id": "503",
"name": "License",
"picture": "/userfiles/upload/2017/503.png"
},
{
"id": "504",
"name": "其它",
"picture": "/userfiles/upload/2017/504.png"
},
{
"id": "80896a88d8c3449bb90c4781ddbd4d49",
"name": "TH inkaNet",
"picture": "/userfiles/upload/2017/81211f2db0c649318e7166e447e91186.jpg"
}
]
複製代碼
正確作法:無論有沒有數據返回,都要寫清楚返回字段。網絡
舉例說明:工具
{
"data": [
{
"id": "101",
"info": [
{
"name": "張1",
"code": "10101"
},
{
"name": "張2",
"code": "10102"
},
{
"name": "張3",
"code": "10103"
}
]
},
{
"id": "102",
"info": [
{
"name": "張4",
"code": "10201"
},
{
"name": "張5",
"code": "10202"
},
{
"name": "張6",
"code": null
}
]
},
{
"id": "104",
"info":null
}
]
}
複製代碼
好比我遇到過的後臺返回的數據舉例以下:
有數據返回的時候:
{
"id": "102",
"info": [
{
"name": "張4",
"code": "10201"
},
{
"name": "張5",
"code": "10202"
},
{
"name": "張6",
"code": null
}
]
}
複製代碼
沒有數據返回的時候,info這個json array類型怎麼就變成了json object類型?莫名其妙:
{
"id": "102",
"info": {
"name": "",
"code": ""
}
}
複製代碼
如下是正確作法,請廣大
後臺新手
get一下: 正確作法: 字段結構不能隨意修改,無論有沒有數據返回都不要隨意修改,沒有數據的就搞一些默認空值填上去。
\
轉義字符。後臺哥們說,大家客戶端的本身去拆分解析吧。我看的想打人,你封裝成一個對象,用[]返回不行嗎?建議:看到這樣的json,遇到後臺哥們見一次打一次。只想甩他一張圖。
請看下圖。這是json格式化以後看到的效果,關鍵字涉及隱私,已打碼處理。
這是一個很規範的接口設計,看着很舒服,處理起來很方便。(順便說一句,推薦你們使用restful
風格的接口)
{
"errorCode": 1,
"errorMsg": "請求失敗",
"data": {
"message": "Problems parsing JSON"
}
}
複製代碼
java新手
或者 混了幾年的老油條,若是你寫出的接口是以上這些,或者還有其餘的奇葩接口,請好好的反思一下,不要有僥倖心理,認爲獨立開發或者小公司無所謂,有這種想法的人勸你先去面壁三分鐘。
- 1.它是我的基礎業務能力的一個展示。
一樣3年java開發兩我的,一個寫的接口條理清晰,結構明確,一目瞭然;另一我的寫出了相似上面這類的接口。 很明顯,前者給人的感受是基礎是比較紮實的。我我的理解,接口編寫對於作後臺的來講是屢見不鮮,它算是一門 基本功,就比如練武之人扎馬步一個道理。後臺跟前端或者客戶端交互都要靠接口,接口寫很差,還談什麼交互? 因此,能寫出好的接口的人,至少有一點能夠看出來,基礎是比較紮實的。
- 2.它是代碼規範素養的一種體現。
接口寫的好的人,能夠推斷這我的寫代碼應該也是比較規範的(雖然不能百分之百確定,但至少它規範的要求本身寫接口)。 假若有一天,你能去大公司,你要是寫的不好的接口,我敢保證,你也在那裏呆不長就被辭退,除非是不注重技術的所謂的大公司
。
- 3.爲後續接口維護節省了不少時間。
接口寫很差的,後續加功能或者改接口,那就等着加班加點苦逼的去修改吧。同時也耽誤了前端或者客戶端的開發進度。
- 4.規範的接口能夠減小先後端人員爲了一個字段在哪一端處理引起的沒必要要的爭吵。
以前我就遇到過明明後臺能夠處理的好比base64編碼
,明明能夠傳一個url給客戶端的,非要搞一個base64過來,叫大家本身去解碼。後臺哥們技術通常,代碼又是老項目,它也不少搞不懂,跟他溝通無效,簡直是浪費時間,沒辦法本身去處理吧。
後臺java
必定要嚴格按java編程規範來作,寫出規範的接口給別人使用。他好你也好。restful
風格的接口的,能夠看看這篇文章 深刻理解什麼是RESTful 接口