成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

App架構設計經驗談:接口的設計

開發 架構
關于接口設計,暫時想到的就這么多了。各位看官看完覺得有遺漏或有哪些需要優化的歡迎提出一起討論。

App與服務器的通信接口如何設計得好,需要考慮的地方挺多的,在此根據我的一些經驗做一些總結分享,旨在拋磚引玉。

[[161737]]

安全機制的設計

現在,大部分App的接口都采用RESTful架構,RESTFul最重要的一個設計原則就是,客戶端與服務器的交互在請求之間是無狀態的,也就是說,當涉及到用戶狀態時,每次請求都要帶上身份驗證信息。實現上,大部分都采用token的認證方式,一般流程是:

  1. 用戶用密碼登錄成功后,服務器返回token給客戶端;

  2. 客戶端將token保存在本地,發起后續的相關請求時,將token發回給服務器;

  3. 服務器檢查token的有效性,有效則返回數據,若無效,分兩種情況:

    • token錯誤,這時需要用戶重新登錄,獲取正確的token

    • token過期,這時客戶端需要再發起一次認證請求,獲取新的token

然而,此種驗證方式存在一個安全性問題:當登錄接口被劫持時,黑客就獲取到了用戶密碼和token,后續則可以對該用戶做任何事情了。用戶只有修改密碼才能奪回控制權。

如何優化呢?***種解決方案是采用HTTPS。HTTPS在HTTP的基礎上添加了SSL安全協議,自動對數據進行了壓縮加密,在一定程序可以防止 監聽、防止劫持、防止重發,安全性可以提高很多。不過,SSL也不是絕對安全的,也存在被劫持的可能。另外,服務器對HTTPS的配置相對有點復雜,還需 要到CA申請證書,而且一般還是收費的。而且,HTTPS效率也比較低。一般,只有安全要求比較高的系統才會采用HTTPS,比如銀行。而大部分對安全要 求沒那么高的App還是采用HTTP的方式。

我們目前的做法是給每個接口都添加簽名。給客戶端分配一個密鑰,每次請求接口時,將密鑰和所有參數組合成源串,根據簽名算法生成簽名值,發送請求時 將簽名一起發送給服務器驗證。類似的實現可參考OAuth1.0的簽名算法。這樣,黑客不知道密鑰,不知道簽名算法,就算攔截到登錄接口,后續請求也無法 成功操作。不過,因為簽名算法比較麻煩,而且容易出錯,只適合對內的接口。如果你們的接口屬于開放的API,則不太適合這種簽名認證的方式了,建議還是使 用OAuth2.0的認證機制。

我們也給每個端分配一個appKey,比如Android、iOS、微信三端,每個端分別分配一個appKey和一個密鑰。沒有傳appKey的請求將報錯,傳錯了appKey的請求也將報錯。這樣,安全性方面又加多了一層防御,同時也方便對不同端做一些不同的處理策略。

另外,現在越來越多App取消了密碼登錄,而采用手機號+短信驗證碼的登錄方式,我在當前的項目中也采用了這種登錄方式。這種登錄方式有幾種好處:

  1. 不需要注冊,不需要修改密碼,也不需要因為忘記密碼而重置密碼的操作了;

  2. 用戶不再需要記住密碼了,也不怕密碼泄露的問題了;

  3. 相對于密碼登錄其安全性明顯提高了。

接口數據的設計

接口的數據一般都采用JSON格式進行傳輸,不過,需要注意的是,JSON的值只有六種數據類型:

  • Number:整數或浮點數

  • String:字符串

  • Boolean:true 或 false

  • Array:數組包含著方括號[]中

  • Object:對象包含在大括號{}中

  • Null:空類型

所以,傳輸的數據類型不能超過這六種數據類型。以前,我們曾經試過傳輸Date類型,它會轉為類似于”2016年1月7日 09時17分42秒 GMT+08:00″這樣的字符串,這在轉換時會產生問題,不同的解析庫解析方式可能不同,有的可能會轉亂,有的可能直接異常了。要避免出錯,必須做特殊 處理,自己手動去做解析。為了根除這種問題,***的解決方案是用毫秒數表示日期。

另外,以前的項目中還出現過字符串的”true”和”false”,或者字符串的數字,甚至還出現過字符串的”null”,導致解析錯誤,尤其 是”null”,導致App奔潰,后來查了好久才查出來是該問題導致的。這都是因為服務端對數據沒處理好,導致有些數據轉為了字符串。所以,在客戶端,也 不能完全信任服務端傳回的數據都是對的,需要對所有異常情況都做相應處理。

服務器返回的數據結構,一般為:

  1.     code:0 
  2.     message: "success" 
  3.     data: { key1: value1, key2: value2, ... } 
  • code: 狀態碼,0表示成功,非0表示各種不同的錯誤

  • message: 描述信息,成功時為”success”,錯誤時則是錯誤信息

  • data: 成功時返回的數據,類型為對象或數據

不同錯誤需要定義不同的狀態碼,屬于客戶端的錯誤和服務端的錯誤也要區分,比如1XX表示客戶端的錯誤,2XX表示服務端的錯誤。這里舉幾個例子:

  • 0:成功

  • 100:請求錯誤

  • 101:缺少appKey

  • 102:缺少簽名

  • 103:缺少參數

  • 200:服務器出錯

  • 201:服務不可用

  • 202:服務器正在重啟

錯誤信息一般有兩種用途:一是客戶端開發人員調試時看具體是什么錯誤;二是作為App錯誤提示直接展示給用戶看。主要還是作為App錯誤提示,直接展示給用戶看的。所以,大部分都是簡短的提示信息。

data字段只在請求成功時才會有數據返回的。數據類型限定為對象或數組,當請求需要的數據為單個對象時則傳回對象,當請求需要的數據是列表時,則 為某個對象的數組。這里需要注意的就是,不要將data傳入字符串或數字,即使請求需要的數據只有一個,比如token,那返回的data應該為:

// 正確
data: { token: 123456 }

// 錯誤
data: 123456

接口版本的設計

接口不可能一成不變,在不停迭代中,總會發生變化。接口的變化一般會有幾種:

  • 數據的變化,比如增加了舊版本不支持的數據類型

  • 參數的變化,比如新增了參數

  • 接口的廢棄,不再使用該接口了

為了適應這些變化,必須得做接口版本的設計。實現上,一般有兩種做法:

  1. 每個接口有各自的版本,一般為接口添加個version的參數。

  2. 整個接口系統有統一的版本,一般在URL中添加版本號,比如http://api.domain.com/v2。

大部分情況下會采用***種方式,當某一個接口有變動時,在這個接口上疊加版本號,并兼容舊版本。App的新版本開發傳參時則將傳入新版本的version。

如果整個接口系統的根基都發生變動的話,比如微博API,從OAuth1.0升級到OAuth2.0,整個API都進行了升級。

有時候,一個接口的變動還會影響到其他接口,但做的時候不一定能發現。因此,***還要有一套完善的測試機制保證每次接口變更都能測試到所有相關層面。

寫在***

關于接口設計,暫時想到的就這么多了。各位看官看完覺得有遺漏或有哪些需要優化的歡迎提出一起討論。

責任編輯:王雪燕 來源: Keegan小鋼
相關推薦

2012-07-13 14:25:59

2018-10-29 11:41:22

架構MVCAndroid

2009-08-03 10:13:13

開發框架

2009-11-02 11:11:07

VB.NET OOP設

2018-09-18 09:28:05

PCB布線數字布線經驗

2011-09-09 09:50:40

Oracle

2009-01-15 09:43:51

Web架構設計緩存

2015-09-23 14:01:51

2017-11-17 07:06:27

互聯網分層架構APP

2021-07-21 16:30:38

iOSAPP架構

2015-09-16 10:13:16

游戲性能

2011-06-21 16:26:19

SEO內部優化

2011-08-15 10:27:48

2015-10-16 14:35:05

SaaSCRM架構設計

2012-08-06 09:27:59

2009-09-14 15:04:44

2024-05-28 07:01:29

2010-01-14 20:05:43

虛擬化數據中心

2013-04-25 09:41:33

網管高級網管網絡管理

2009-06-29 15:39:53

Servlet和JSPServlet引擎
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91久久久久久 | 成人国产在线视频 | 国产精品高潮呻吟久久av黑人 | 欧美一区二区免费电影 | 福利一区在线观看 | 国产精品久久久久不卡 | 亚洲男女视频在线观看 | 精品欧美黑人一区二区三区 | 欧美专区在线 | 国产精品久久久久久久久久久久 | 久久久久久久久久久久一区二区 | 亚洲 91| 一区精品在线观看 | 成人教育av | 国内毛片毛片毛片毛片 | 国产成人精品一区二 | 成人免费网站 | 一级黄色片一级黄色片 | 高清久久| 久久久久久亚洲欧洲 | 女女百合av大片一区二区三区九县 | 在线观看成人 | 国产综合久久久久久鬼色 | 精品国产91久久久久久 | 夜夜爽99久久国产综合精品女不卡 | 99精品国产一区二区三区 | 久久综合久久综合久久综合 | 日韩欧美在线视频一区 | 给我免费的视频在线观看 | 成人精品鲁一区一区二区 | 久久6| 韩国av一区二区 | 欧美日韩一区二区在线 | 国产精品国产精品 | 亚洲一区二区三区福利 | 国产一级淫片a直接免费看 免费a网站 | 国产精品免费播放 | 国产小网站 | 久久99精品久久久久久国产越南 | 狠狠涩| 91精品国产91 |