移動App的REST API設計實踐

2014.9.8更新:

最近有一篇關于HTTP API設計的文章值得參考:https://github.com/interagent/http-api-design,中文翻譯:https://github.com/cocoajin/http-api-design-ZH_CN

通訊協(xié)議

一些只是對服務器數據進行CRUD操作的App,通常采用HTTP協(xié)議,為了安全也可以采用HTTPS協(xié)議。IM軟件可以選擇使用XMPP協(xié)議。

其他一些特有場景的App可能基于Socket自定義協(xié)議。

SOCKET是實現傳輸層協(xié)議的一種編程API,可以是TCP,也可以是UDP。

TCP --- 傳輸控制協(xié)議,提供的是面向連接、可靠的字節(jié)流服務。TCP提供超時重發(fā),丟棄重復數據,檢驗數據,流量控制等功能,保證數據能從一端傳到另一端。

UDP --- 用戶數據報協(xié)議,是一個無連接的簡單的面向數據報的運輸層協(xié)議。UDP不提供可靠性,它只是把應用程序傳給IP層的數據報發(fā)送出去,但是并不能保證它們能到達目的地。

在需要保證需要傳輸數據到對方的時候應該選擇TCP協(xié)議,比如文件傳輸。而像在線視頻播放這些,可以不用保證數據100%被接受的,可以用UDP,因為丟失一幀畫面數據沒什么影響,而且用UDP速度會更快。

最近也有聽說用WebSocket做通訊的,可以在Web端和App端共用一個接口。

數據格式

比較通用的數據交互格式是JSON和XML。在現在,JSON格式使用的更為廣泛,因為結構簡單而且解析方便。

iOS5之后的SDK提供了NSJSONSerialization類解析JSON,而Android SDK本身就自帶了org.json 的相關包來提供JSON解析的功能。如果在Android里面對JSON的解析或者序列化性能有要求,可以考慮使用android.utils包里面的JsonReader 和 JsonWriter類。它們是用流式解析的方式,不過使用更加繁瑣。也可以考慮使用Google的Gson,阿里巴巴的fastjson,以及Jackson這些開源JSON處理的庫,它們提供了更多的功能,也有更好的性能。

XML設計目標是“Extensible Markup Language”,可擴展的標記語言,而不是JSON的只是作為一個數據序列化的語言。XML格式也有自己的優(yōu)點,比如你可以用通用的XPath查詢特定的數據而不用用一個個嵌套的循環(huán)或者分支語句從一個復雜的數據中拿到一個特定的值。

REST架構的API設計

可以參考阮一峰文章http://www.ruanyifeng.com/blog/2014/05/restful_api.html

本文其余內容基本都是在談REST架構的API

一些感想:

  1. API域名與網站域名分開,比如使用 https://api.example.com 這樣的方式
  2. API請求中應該加入API版本號,比如在URL中加入版本號,如
    https://api.example.com/v1/, 這樣當API升級的或者改動的時候,可以保留舊的API服務器,把新的API服務器mount到https://api.example.com/v2/ 上,這樣使用舊的API的App也不會出現問題
  3. API返回的數據量小的時候,沒太多必要進行zip壓縮。API返回數據大的時候,要考慮API設計是否適當。
    4.寫API要方便使用這些API開發(fā)的人員測試,比如寫好文檔,使用https://helloreverb.com/developers/swagger 這樣的工具生成調試頁面。

性能

要避免寫API Server的時候出現一些低級的錯誤,比如數據庫查詢用了N+1 Query。

其他性能的問題其實和Web開發(fā)大同小異,無非是橫向和縱向的幾種不同方式的擴展。

安全性和用戶認證

如果使用第三方的API,通常采用Oauth協(xié)議或者SSO登錄。

如果是自己開發(fā),因為自己寫HTTP請求不會和瀏覽器發(fā)送的時候自動維護一個Cookie,所以可以自己手動維護一個Token,代替Cookie的作用來進行用戶驗證。

對于Token等關鍵的數據,不要明文保存在設備本地,可以用iOS提供的Keychain這樣的機制進行加密存儲。

也有用Xauth協(xié)議的,類似Oauth的簡化版。

安全方便,和Web開發(fā)一樣,不要相信用戶的任何數據,服務器端都應該做對應的認證。

此外,如果對一些數據有較高的安全需求,那么應該避免把秘密的數據用明文寫在代碼里,比如一些第三方Acess Key,可以在啟動的時候動態(tài)請求,否則很容易被反編譯獲取。

Android一定要做好反編譯工作。

學習

Github的API設計應該算得上優(yōu)秀,值得參考:
https://developer.github.com/v3/

此外,可以用Charles這些抓包工具,學習和參考別人的App與服務器的數據交互內容,Charles甚至可以在你的開發(fā)的移動設備上安裝自簽名證書,采用類似中間人攻擊的方式來獲取App采用HTTPS協(xié)議交互的數據的明文。

如果你不想寫API

你可以使用Parse.com 或者 AVOSCloud 這些BASS平臺提供的服務。這些服務很適合一些不需要在服務器端提供復雜操作,以及前期的原型開發(fā)。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現,斷路器,智...
    卡卡羅2017閱讀 136,554評論 19 139
  • //我所經歷的大數據平臺發(fā)展史(三):互聯網時代 ? 上篇http://www.infoq.com/cn/arti...
    葡萄喃喃囈語閱讀 51,685評論 10 200
  • 初心 2010.夏 .艷陽 17歲的夏唯唯從來沒有想過她會遇見林傲君 那個眉清目秀 明眸皓齒的男孩 他的出現...
    煙華小姐閱讀 567評論 6 4
  • 離開北國的家鄉(xiāng)去往祖國的南端念書已有些年頭了。放假回家的第四天,睜開眼,望見窗外銀裝素裹、大雪紛飛,縱然作為一個所...
    wcrystal閱讀 277評論 0 4
  • 因為這個,穆魚好多天沒理九果。每次九果把刀子的光在他的窗前和門前晃來晃去,他都裝作沒看見。當然很快他又恢復了鏡子與...
    姜辣素閱讀 318評論 0 1

友情鏈接更多精彩內容