目前許多的Web應用和移動應用都使用了前後端分離的開發模式,前後端分離簡單的說就是前端或移動端通過網絡API接口和後臺進行交互,獲得接口中提供的數據並負責用戶界面的渲染。API是應用程序的編程接口的縮寫,網絡API通常指的是基於一個URL(統一資源定位符)可以訪問到的資源,也就是說通過這個URL我們就可以請求服務器對某個資源進行操作並返回操作的結果。大家可以想想,網絡API接口不也是一種封裝嗎,簡單的說就是將複雜的業務邏輯隱藏在簡單的API接口中。
URL的通用格式如下所示:
協議://用戶名:口令@主機:端口/路徑1/.../路徑N/資源名
說明:URL中的用戶名(有可能不需要提供用戶名)、口令(有可能不需要提供口令)、端口(有可能使用默認端口)、路徑(資源有可能直接位於根路徑
/
下)並不是必需的部分,可以根據需要進行設置。
網絡API通常基於HTTP或HTTPS進行訪問,基於HTTP/HTTPS最大的好處就在於訪問起來非常的簡單方便,而且可以跨語言、跨應用進行訪問和互操作。
爲移動端或者PC端設計網絡API接口一個非常重要的原則是:根據業務實體而不是用戶界面或操作來設計API接口。如果API接口的設計是根據用戶的操作或者界面上的功能設置來設計,隨着需求的變更,用戶界面也會進行調整,需要的數據也在發生變化,那麼後端開發者就要不停的調整API,或者給一個API設計出多個版本,這些都會使項目的開發和維護成本增加。我們可以將業務實體理解爲服務器提供的資源,而URL就是資源的定位符(標識符),這種方式是最爲簡單自然的。對於相對複雜的用戶操作,我們可以提供一個“門面”(設計模式中的“門面模式”),通過該“門面”把多個接口的功能組裝起來即可。
下面是某個網站開放API的接口,可以看出API的設計是圍繞業務實體來進行的,而且都做到了“見名知意”。
評論 | |
---|---|
comments/show | 獲取某條微博的評論列表 |
comments/by_me | 自己的評論列表 |
comments/to_me | 收到的評論列表 |
comments/mentions | @了自己的評論列表 |
comments/create | 創建一條評論 |
comments/destroy | 刪除一條評論 |
comments/reply | 回覆一條評論 |
需要說明的是,上面的API接口並不是REST風格的。REST是一種網絡應用架構風格,被認爲最適合分佈式的網絡應用。關於REST的知識,可以閱讀阮一峯的《理解RESTful架構》以及《RESTful API設計指南》,當然這兩篇文章大家也要批判的閱讀,因爲上面闡述的觀點並不完全正確,有些內容甚至是自相矛盾的。
API接口返回的數據通常都是JSON或XML格式,XML這種數據格式目前基本已經被棄用了。對於JSON格式的數據,我們需要做到不要返回null這的值,因爲這樣的值一旦處置失當,會給前端和移動端開發帶來不必要的麻煩(因爲開發者有可能會使用強類型語言)。要解決這個問題可以從源頭入手,在設計數據庫的時候,儘量給每個字段都加上“not null”約束或者設置合理的默認值約束。
- 更新提示問題:設計一個每次使用系統首先要訪問的API,該API會向移動端返回系統更新的相關信息,這樣就可以提升用戶更新App了。
- 版本升級問題:API版本升級時應該考慮對低版本的兼容,同時要讓新版本和舊版本都能夠被訪問,可以在URL中包含版本信息或者在將版本號放在HTTP(S)協議頭部,關於這個問題有很多的爭論,有興趣的可以看看stack overflow上面對這個問題的討論。
- 圖片尺寸問題:移動端對於一張圖片可能需要不同的尺寸,可以在獲取圖片時傳入尺寸參數並獲取對應的資源;更好的做法是直接使用雲存儲或CDN(直接提供了圖片縮放的功能),這樣可以加速對資源的訪問。
下面以設計評論接口爲例,簡單說明接口文檔應該如何撰寫。
首先,我們可以定義全局返回狀態碼。
返回碼 | 返回信息 | 說明 |
---|---|---|
10000 | 獲取評論成功 | |
10001 | 創建評論成功 | |
10002 | 無法創建評論 | 創建評論時因違反審覈機制而無法創建 |
10003 | 評論已被刪除 | 查看評論時評論因不和諧因素已被刪除 |
10004 | …… | …… |
-
獲取文章評論。
URL:GET
/articles/{article-id}/comments/
開發者:王大錘
最後更新時間:2018年8月10日
標籤:v 1.0
接口說明:獲取指定文章的所有評論
使用幫助:默認返回20條數據,需要在請求頭中設置身份標識(key)
請求參數:
參數名 類型 是否必填 參數位置 說明 page 整數 否 查詢參數 頁碼,默認值1 size 整數 否 查詢參數 每次獲取評論數量(10~100),默認值20 key 字符串 是 請求頭 用戶的身份標識 響應信息:
{ "code": 10000, "message": "獲取評論成功", "page": 1, "size": 10, "totalPage": 35, "contents": [ { "userId": 1700095, "nickname": "王大錘", "pubDate": "2018年7月31日", "content": "小編是不是有病呀", /* ... */ }, { "userId", 1995322, "nickname": "白元芳", "pubDate": "2018年8月2日", "content": "樓上說得好", /* ... */ } ] /* ... */ }
-
新增文章評論。
POST
/articles/{article-id}/comments
開發者:王大錘
最後更新時間:2018年8月10日
標籤:v 1.0
接口說明:爲指定的文章創建評論
使用幫助:暫無
請求參數:
參數名 類型 是否必填 參數位置 說明 userId 字符串 是 消息體 用戶ID key 字符串 是 請求頭 用戶的令牌 content 字符串 是 消息體 評論的內容 響應信息:
{ "code": 10001, "message": "創建評論成功", "comment": { "pubDate": "2018年7月31日", "content": "小編是不是有病呀" /* ... */ } /* ... */ }