后端接口設計需要注意的一些問題


后端接口設計需要注意的一些問題:

1、跨平台性 
所謂跨平台是指我們的接口要能夠支持不同的終端,比如android、ios、windowsphone以及桌面軟件、網站等,
一套接口,支持多端,就像當年Java的口號一樣“Write Once,Run Anywhere”。 
當然從本質上講,服務器端的接口跟終端是沒有太大關系的,只是接口應該考慮到不同端的接入成本, 
采用通用的解決方案,比如通信協議就采用最常用的HTTP協議,如果是即時通信,可以采用開放的XMPP協議, 
做游戲的可以采用可靠的TCP協議,除非TCP不夠用了,再采用定制的UDP協議。 
數據交換采用xml或者json格式等等。 
總之,要達到的目標就是讓不同的端能夠很方便的使用你的接口。 

2、良好的響應速度 
如果要用一個指標來衡量接口的性能的話,那么我想最重要的就是響應速度了。 
接口應該以最快的速度將數據返回給請求者。 
試想,當我們打開一個頁面,如果“努力加載中”之類的提示超過三五秒鍾的話, 
我們肯定會變得不耐煩,移動app本來大部分就是用戶在碎片化時間來使用的, 
在有限的時間內,用戶恨不得獲得的信息越多越好,即使你的app界面設計的再好,用戶也不會買賬。 

提高響應速度又是個老生常談的問題,大體上應該按照以下步驟來做: 
初期,以功能為主,要保證功能完整,滿足業務需求,這階段可以使用動態的語言,比如java、php、asp.net等, 
配合設計良好的數據庫結構和索引,能滿足一定的需求; 
其次,隨着用戶的增多,可以考慮一些緩存方案,緩存是解決性能問題的萬金油,通常能起到立竿見影的效果。  
最常用的靜態文件緩存,memcached內存緩存等。 
然后,單台機器的吞吐率不行了,通過負載均衡多加幾台機器就行了。七八台機器,支持每天千萬級的接口調用是可行的。 
或者,直接采用CDN的解決方案,將絕大多數的靜態資源交給CDN去處理。 

總之,要達到的目標就是快,一個頁面,秒開最好,超過三秒就需要找找原因了。 

3、接口要為移動客戶端考慮 
接口不僅僅是提供數據和功能就完事了,更應該充分考慮移動端的特性,為移動端提供更加方便、快捷的接口。 
比如,在移動端里,下拉刷新和上拉加載更多是很常見的功能,如果接口仍然按照傳統的web思路, 
只提供按頁讀取的話,就會造成移動端的額外的數據請求和計算。 這時,接口就應該針對這兩種類型的操作提供額外的支持。 

再比如,對於一個新聞閱讀類的app來說,最新的新聞列表里的文章,特別是前幾條,用戶很容易點擊進去看, 
而后面的老的文章列表,一來用戶下滑加載好幾頁的情況較少,二來過時的新聞用戶也很少點。 
如果,接口在返回新聞列表時,對於最新的列表,可以直接把文章的正文(或者部分正文,比如一屏的內容)信息一起傳給客戶端, 
這樣,用戶在打開新聞詳情頁的時候,就不用再從服務器端獲取了,自然可以做到秒開。 

比如訪問第一頁時,接口可以返回文章內容,如下所示 ,content=1表示加載文章內容 
newslist?page=1&pagesize=20&content=1 
其他頁時,newslist?page=5&pagesize=20&content=0 ,不用加載文章內容。 

當然,客戶端要跟接口做好配合,搭配好,才能最大化的提高性能。 
比如,移動端都有左右滑動來看上一篇、下一篇文章或者圖片的功能, 
如果,當用戶請求某篇文章的時候,服務器端順便也把下一篇文章的內容返回回來了, 

那么當用戶看下一篇的時候,是不是就很快了呢。

當然這種preload的方案也不能濫用,如果預加載數據的命中率較低的話,也不行,白白浪費了很多的流量。


4、考慮移動端的網絡情況和耗電量 
如果讓我們說出哪類app比較好,可能還不大好說,但是如果讓我們說出哪些app很差, 
我們肯定會說出那些 體積很大、占用內存多、界面很卡、費電的app不好。 

對於移動APP開發者來說, 網絡流量和電池電量是不得不考慮的問題。 
不過,您也許會說,這些跟接口沒啥關系吧,服務器端的接口還能管得了客戶端的網絡流量和電量? 

對於網絡情況,接口應該具備為不同的網絡提供不同的內容的能力, 
通常,移動端的上網方式無非是2G(GSM、GPRS、EDGE)、3G(CDMA、TDSCDMA、WCDMA)、WIFI, 
設想一下,如果用戶在流量需要花錢的情況下,你的app給用戶展示了視頻、音頻、大量的圖片而沒有通知用戶的情況下, 
用戶會怎么想,畢竟國內的流量費用還是很貴的。 
還以上面的新聞列表接口為例,如果我們能夠知道用戶的網絡情況,只有在wifi的情況下才給用戶傳輸封面圖、縮略圖之類的, 
是不是可以幫用戶節省很多流量呢。 
newslist?page=1&pagesize=20&content=1&network=wifi 

對於電量,首先我們要弄清楚,app的哪些方面會消耗電量? 
比如app有大量的計算、有很炫的視覺畫面都會消耗電量, 另外,不斷的移動網絡鏈接也會消耗大量的電量, 
我們都知道移動網絡是通過無線電波來通訊的,那么發射裝置就需要消耗一定的電量來發射和接收無線信號。 
特別的是,頻繁的鏈接會不斷的切換網絡設備與移動基站之間連接狀態,這都會消耗一部分電量。 

所以,對於接口而言,盡量用少的鏈接傳輸多的數據, 
比如,對於關於我們、版本更新以及一些系統配置信息,完全可以通過一次鏈接全部返回給客戶端。 

5、通用的數據交換格式 
目前,對於接口和客戶端的數據交換格式,基本上就是兩種,xml和json,而現在使用json的應該占大多數。 
交換的數據包括兩種,一種是客戶端請求服務器端接口時傳遞的一些參數,一種是服務器端返回給客戶端的數據。 

對於客戶端的請求參數,現在也越來越多的接口要求采用json的格式,而不是以往最常見的key_value對了。 
比如,接口需要username和password兩個參數 
key_value pair的方式是: 
username=hutuseng&password=hutusengpwd 
然后通過GET或者POST方式傳送。 
而通過json方式交換數據的話,格式如下,直接POST到服務器端。 

'username':'hutuseng', 
'password':'hutusengpwd' 


對於服務器端返回的json數據格式,需要注意兩個問題: 
一是漢字編碼問題,因為json(javascript)內部支持Unicode編碼,會將漢字等轉換成unicode編碼保存,  
所以在返回結果中,對於中文,可以直接輸出中文,也可以輸出中文的unicode編碼, 
json解析器都會很好的解析。  
比如下面兩種方式都是可以的。 
{"code":"208","data":"\u53c2\u6570\u4e0d\u5b8c\u6574"}  

"code": "208", 
"data": "參數不完整" 

二是字段的數據類型,特別是數字類型的,json中盡量轉成數字格式, 
比如 

'userid':128 

不要寫成 

'userid':'128' 


6、接口統計功能 
在做PC端網站的時候,我們都會給我們的網站加上個統計功能,要么自己寫統計系統,要么使用第三方的比如GA、百度等。 
移動端接口API則需要我們自己實現統計功能, 
這時就需要我們盡可能多的收集客戶端的信息,除了傳統的IP、User-Agent之外,還應該收集一些移動相關的信息, 
比如 
手機操作系統,是android還是ios,都是什么版本, 
用戶使用的網絡狀況,是2G、3G、4G還是WIFI 
客戶端APP是什么版本信息。 

這樣,有助於我們更好的了解我們用戶的使用情況。 

7、客戶端與服務端的肥瘦平衡 
在以前C/S、B/S架構時,我們就已多次討論過這個問題,客戶端是瘦點好還是肥點好,當然也沒有固定答案,需要自己根據實際情況去做權衡。 
但是,在移動開發中,由於客戶端的修改會很費時費力,特別是IOS應用還要經過Apple審核, 
另外,當前IOS開發人員、Android開發人員的人工成本普遍較高,人才緊缺, 
基於這兩點,能在服務器端實現的功能就不要放在客戶端,畢竟服務器端程序的修改要比客戶端方便、靈活、快捷的多。 

8、隱式用戶與顯式用戶 
顯式用戶和隱式用戶,我不知道這兩個詞用的是否確切。  
顯式用戶指的是,APP程序中有用戶系統,一個username、password正確的合法用戶,稱之為顯式的用戶, 
通常顯式用戶都需要注冊,登錄以后能完成一些個人相關的操作。 

隱式用戶指的是,APP程序本身就沒有用戶系統,或者一個在沒有登錄的情況下,使用我們APP的用戶。 
在這種情況下,可以通過客戶端生成的UDID來標識一個用戶。 

有了用戶信息,我們就能夠了解不同用戶的使用習慣,而不僅僅是全體用戶的一個整體的統計信息, 
有了這些個體的信息之后,就可以做一些用戶分群、個性化推薦之類的事情。 

9、安全問題  
網絡安全已經從桌面互聯網轉到了移動互聯網,從客戶端蔓延到了接口API中。 

傳統固若金湯的網站,很可能因為接口的一點疏忽而遭受入侵。現在,在很多白帽子或者黑客的入侵思路中,

先看看移動端接口是否存在漏洞,再看網站是否有漏洞。

客戶端APP與接口的通信很容易被得到,只要在中間路由上嗅探一下就行, 
whireshark、tcpdump這類工具使得這項工作變得簡單無比。 

所以,接口的安全工作不能馬虎,暴力破解啊、SQL Injection啊、偽造請求和數據啊、重復提交啊也要考慮到, 
如果數據特別敏感,可以考慮采用SSL/TLS等加密傳輸,或者客戶端、服務器端約定一個加密算法和密鑰,對來往傳輸的數據進行加密、解密 
如果不采用RESTful API,可以采用基於WSDL和SOAP的Web Service的安全措施。 

 

10、良好的接口說明文檔和測試程序
接口文檔有時候是項目初期就定下來的,前后端開發人員按照接口規范開發,有的是接口開發完成后寫的。
接口文檔要清晰、明了,包含多少個接口,每個接口的地址、參數、請求方式、數據交換格式、返回值等都要寫清楚。
接口測試程序,有條件的話,也可以提供,方便前后端的調試。

11、版本的維護
隨着業務的變化,客戶端APP和服務器端API都會發生變化,增加新的功能,修改已有的功能, 
增加功能還好說, 如果是接口需要修改,那么就面臨着同一個接口要同時為不同版本的客戶端服務的問題。 
因此,服務器端接口也要做好相應的版本維護。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM