APP開發(fā)怎樣實(shí)現(xiàn)api接口的設(shè)計工作,深圳APP開發(fā)公司結(jié)合多年項目開發(fā)設(shè)計工作,歸納整理出如下十一條具體操作方法,在接口設(shè)計中要注意以下事項。
(1)首先需要確定APP和服務(wù)器間用什么格式傳輸數(shù)據(jù),常用的有兩種:XML和JSON。下面使用了XML格式和JSON格式表示同樣的信息進(jìn)行比較:
<?xmlversion="1.0"encoding="utf-8"?><country><name>中國</name><province><name>廣東</name><citys><city>廣州</city><city>深圳</city></citys> </province><province><name>廣西</name><citys><city>南寧</city><city>桂林</city></citys> </province></country>以上是XML格式文件的數(shù)據(jù)。
{"name":"中國","quantity":2,"provinces":[{"name":"廣東","quantity":2,"citys":{"city":["廣州","深圳"]}},{"name":"廣西","quantity":2,"citys":{"city":["南寧","桂林"]}}
]}
以上是JSON格式文件的數(shù)據(jù)。從上述示例可看出,XML文件中存在大量的描述信息,大大增加了網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)量;同樣的內(nèi)容用JSON格式傳輸?shù)臄?shù)據(jù)量比較少,相應(yīng)的網(wǎng)絡(luò)傳輸速度和數(shù)據(jù)解析速度也都快,所以首選JSON格式。JSON格式的字段類型值常用的有以下幾種。Number:整數(shù)或浮點(diǎn)數(shù)。String:字符串。Boolean:true或false。上述三種屬于基本類型。Array:數(shù)組,包含在方括號[]中。Object:對象,包含在大括號\'7b\'7d中。
上述兩種屬于復(fù)合類型,其中可以包含各基本類型字段。示例如下:
{//對象"name":"中國",//字符串"quantity":2,//整數(shù)"isAsia":true,//布爾類型"provinces":[//數(shù)組{"name":"廣東","quantity":2,"citys":{"city":["廣州","深圳"]}},{"name":"廣西","quantity":2,"citys":{
"city":["南寧","桂林"]}}]}
(2)需要設(shè)計JSON數(shù)據(jù)的具體格式。APP發(fā)送請求(有非數(shù)組格式的具體參數(shù)),示例如下:
{"params":{"username":"aaa","password":"123456"}}
APP發(fā)送請求(有數(shù)組格式的具體參數(shù)),示例如下:
{"params":{"products":[{"name":"可樂","quantity":1},{"name":"雪碧","quantity":2}]}}APP發(fā)送請求(無具體參數(shù)),示例如下:{"params":{}}服務(wù)器端處理成功后,返回給APP的數(shù)據(jù)(只返回操作狀態(tài),不返回數(shù)據(jù)),示例如下:
{"code":800}服務(wù)器端處理成功后,返回給APP的數(shù)據(jù)(返回操作狀態(tài)和非數(shù)組數(shù)據(jù)),示例如下:
{"code":800"result":{"message":"訂單提交成功"}}服務(wù)器端處理失敗后,返回給APP的數(shù)據(jù)(只返回操作狀態(tài)和出錯提示),示例如下:{"code":800"result":{"products":[
{"name":"可樂","quantity":1},{"name":"雪碧","quantity":2}]}}操作失?。ㄖ环祷夭僮鳡顟B(tài)和出錯提示),示例如下:{"code":801"result":{"message":"密碼錯誤,請重新輸入"}}在定義JSON中的字段名稱時,要盡量短小,以減少網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)量。
(3)服務(wù)器端采用的語言有Java這樣的強(qiáng)類型語言,也有PHP這樣的弱類型語言,弱類型語言對變量類型沒有強(qiáng)類型語言那么嚴(yán)格,但Android和iOS開發(fā)使用的語言都是強(qiáng)類型的,導(dǎo)致APP端常會遇到變量類型出錯的問題。如需要整型數(shù)據(jù),結(jié)果服務(wù)器傳的數(shù)字有小數(shù);需要非字符串類型的數(shù)據(jù),結(jié)果服務(wù)器傳的數(shù)據(jù)是字符串等。為解決這類問題,在和服務(wù)器端定義字段的數(shù)據(jù)類型時,建議使用以下方案。在APP端涉及數(shù)學(xué)的加、減、乘、除或比較大小運(yùn)算的字段,統(tǒng)一使用double類型。int和float類型可以算是double類型的子集,這樣只要APP端使用double類型,無論服務(wù)器端返回的是int類型,還是float類型,都不會解析出錯。布爾型的字段也使用double類型代替,服務(wù)器端返回1表示true,返回0表示false。
不涉及數(shù)學(xué)的加、減、乘、除或比較大小運(yùn)算且非布爾型的字段,統(tǒng)一使用字符串類型。字符串類型的適應(yīng)性比較強(qiáng),無論哪種類型的數(shù)據(jù),都可以當(dāng)字符串處理,解析的時候不容易出錯。這樣APP和服務(wù)器端交互,只使用了兩種基本數(shù)據(jù)類型,大大減少了由于各種數(shù)據(jù)類型不兼容導(dǎo)致APP端數(shù)據(jù)解析出錯的問題。
(4)APP從服務(wù)器讀取數(shù)據(jù)的時候,會遇到數(shù)據(jù)為空的情況,此時服務(wù)器端返回給APP的數(shù)據(jù)類型應(yīng)該和數(shù)據(jù)不為空時的類型一致。如下所示:{"code":800"result":{"nikeName":""}}
nikeName字段的類型是字符串,當(dāng)其值為空時,應(yīng)返回空字符串"",而不應(yīng)返回null。{"code":800"result":{"products":[]}}products字段的類型是數(shù)組,當(dāng)其值為空時,應(yīng)返回空數(shù)組[],而不應(yīng)返回null或其他類型的數(shù)據(jù)。
(5)因為服務(wù)器端的接口代碼可能會發(fā)生變化,所以在APP向服務(wù)器端發(fā)送請求時,最好把接口的版本號也帶上,如下所示:{"version":1.0,"params":{"username":"aaa","password":"123456"
}}
以上JSON數(shù)據(jù)中,version字段的值表示當(dāng)前使用接口的版本號為1.0。如果已經(jīng)上線的舊APP中使用的接口版本是1.0,在上線后接口更新到1.1版本,而且不兼容1.0版本,用戶有可能不更新APP,還是使用舊版本APP。服務(wù)器端接收到請求后,發(fā)現(xiàn)APP使用的接口版本是1.0,就可以調(diào)用舊接口處理APP請求。如果請求中不帶版本號,遇到這種狀況,就很難處理了。
(6)APP常需要從服務(wù)器獲取圖片,但服務(wù)器存儲的圖片尺寸往往不完全符合APP需要,需要將圖片放大或縮小,因為服務(wù)器的性能比手機(jī)高,所以最好是在服務(wù)器端按APP的需求處理圖片,然后把處理過的圖片發(fā)給APP。APP在發(fā)送獲取圖片的請求時,把所需圖片的寬度和高度發(fā)給服務(wù)器,如采用GET方法,可以按以下方式。
http://www.hello.com/getimage/2/width/100/hight/100服務(wù)器收到請求,就可先按APP要求的尺寸處理圖片,再發(fā)給APP。當(dāng)然也可以用POST方法實(shí)現(xiàn),用JSON格式傳遞參數(shù),示例如下:
{"version":1.0,"params":{"imageId":2,"width":100,"hight":100}}
(7)大多數(shù)APP和服務(wù)器交互時用HTTP協(xié)議,每向服務(wù)器發(fā)送一個請求都要先建立連接,傳輸數(shù)據(jù)后再斷開連接。即使服務(wù)器端有連接池設(shè)計,連接池中容納的
連接個數(shù)也是有限制的。在設(shè)計接口時,APP每執(zhí)行一個動作盡量做到只向服務(wù)器發(fā)送一次請求,減少APP發(fā)送請求的次數(shù),從而減少APP和服務(wù)器建立連接和斷開連接消耗的時間及資源,提高程序響應(yīng)速度。
(8)對于向APP返回數(shù)組數(shù)據(jù)的接口應(yīng)設(shè)計支持分頁操作,并提供參數(shù)以方便APP設(shè)置獲取元素的起始位置和獲取的個數(shù)。例如,數(shù)組中有100個元素,APP端第一次從第1個元素開始只獲取10個元素,第二次從第11個元素開始只獲取5個元素。在電商APP中讀取商品列表和訂單列表可以這樣設(shè)計。獲取商品列表的JSON數(shù)據(jù)如下所示:
{"version":1.0,"params":{
"categoryId":1,"offset":0,"limit":10}}其中categoryId表示讀取哪一類別的商品列表,offset表示從商品列表中的第一個商品開始讀取商品數(shù)據(jù),limit表示讀取10個商品數(shù)據(jù)。limit的數(shù)值也可以在服務(wù)器端設(shè)置,此時以服務(wù)器端的數(shù)值為準(zhǔn),APP傳遞的數(shù)值不起作用。
(9)對于可能會變動的功能邏輯,盡量放在服務(wù)器端實(shí)現(xiàn),而不是APP本地實(shí)現(xiàn),這樣后續(xù)的功能變更時修改服務(wù)器端的代碼就可以了,不需要用戶升級APP。例如,電商APP中商品的默認(rèn)排序功能,在服務(wù)器端可以把商品按價格或銷量排序后,再把數(shù)據(jù)傳遞給APP,APP端只負(fù)責(zé)顯示就可以了。
(10)APP端在使用服務(wù)器接口的時候,常會遇到從服務(wù)器傳來的JSON數(shù)據(jù)類型和約定的不一致,導(dǎo)致APP解析出錯的問題。APP遇到此類問題時往往會Crash,需要對此問題做特別處理,如下所示:try{//parseJson為解析從服務(wù)器返回的JSON數(shù)據(jù)的方法Tmodel=parseJson(jsonData);onSuccess(model);}catch(Exceptione){message="數(shù)據(jù)解析出錯";onError(message);}開發(fā)AndroidAPP時,利用try…catch…機(jī)制可以有效防止APPCrash,并提示用戶出現(xiàn)了什么問題。在開發(fā)階段,APP應(yīng)明確提示“數(shù)據(jù)解析出錯”,這樣有利于發(fā)現(xiàn)和解決問題。上線后,用戶在使用APP的時候遇到這類問題,用戶不一定理解具體含義,可換種方式提示。
如圖3-1所示,明確告知用戶服務(wù)器端出現(xiàn)問題了,需要聯(lián)系客服解決。
圖3-1開發(fā)階段通常使用Debug版本,而線上版本是Release版本,利用編譯選項可以實(shí)現(xiàn)不同版本顯示不同的提示信息。
(11)服務(wù)器端設(shè)計接口的時候,需要考慮到APP重復(fù)提交數(shù)據(jù)的情況。例如,APP和服務(wù)器的響應(yīng)超時時間是10秒,服務(wù)器收到APP的請求后,在11秒內(nèi)完成了處理,但此時APP會提示用戶連接超時,用戶往往會再次操作,APP就向服務(wù)器發(fā)起重復(fù)請求。好了,APP開發(fā)公司本文關(guān)于“APP開發(fā)關(guān)于api接口設(shè)計所需注意的十一條事項”的經(jīng)驗就分享到這里,謝謝關(guān)注,博納網(wǎng)絡(luò)再次提醒您,以上演示代碼需要各位APP開發(fā)愛好者自行根據(jù)開發(fā)規(guī)則排列。