移動App的REST API設計實踐

原文:http://www.jianshu.com/p/23cccb3a90b1html

通信協議

一些只是對服務器數據進行CRUD操做的App,一般採用HTTP協議,爲了安全也能夠採用HTTPS協議。IM軟件能夠選擇使用XMPP協議。android

其餘一些特有場景的App可能基於Socket自定義協議。git

SOCKET是實現傳輸層協議的一種編程API,能夠是TCP,也能夠是UDP。github

TCP --- 傳輸控制協議,提供的是面向鏈接、可靠的字節流服務。TCP提供超時重發,丟棄重複數據,檢驗數據,流量控制等功能,保證數據能從一端傳到另外一端。數據庫

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

在須要保證須要傳輸數據到對方的時候應該選擇TCP協議,好比文件傳輸。而像在線視頻播放這些,能夠不用保證數據100%被接受的,能夠用UDP,由於丟失一幀畫面數據沒什麼影響,並且用UDP速度會更快。json

最近也有據說用WebSocket作通信的,能夠在Web端和App端共用一個接口。api

數據格式

比較通用的數據交互格式是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格式也有本身的優勢,好比你能夠用通用的XPath查詢特定的數據而不用用一個個嵌套的循環或者分支語句從一個複雜的數據中拿到一個特定的值。

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開發的人員測試,好比寫好文檔,使用
    https://helloreverb.com/developers/swagger 這樣的工具生成調試頁面。

性能

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

其餘性能的問題其實和Web開發大同小異,無非是橫向和縱向的幾種不一樣方式的擴展。

安全性和用戶認證

若是使用第三方的API,一般採用Oauth協議或者SSO登陸。

若是是本身開發,由於本身寫HTTP請求不會和瀏覽器發送的時候自動維護一個Cookie,因此能夠本身手動維護一個Token,代替Cookie的做用來進行用戶驗證。

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

也有用Xauth協議的,相似Oauth的簡化版。

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

此外,若是對一些數據有較高的安全需求,那麼應該避免把祕密的數據用明文寫在代碼裏,好比一些第三方Acess Key,能夠在啓動的時候動態請求,不然很容易被反編譯獲取。

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

學習

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

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

若是你不想寫API

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

相關文章
相關標籤/搜索