Skip to content

Latest commit

 

History

History
148 lines (104 loc) · 7.54 KB

94.網絡API接口設計.md

File metadata and controls

148 lines (104 loc) · 7.54 KB

網絡API接口設計

目前許多的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接口返回的數據通常都是JSONXML格式,XML這種數據格式目前基本已經被棄用了。對於JSON格式的數據,我們需要做到不要返回null這的值,因爲這樣的值一旦處置失當,會給前端和移動端開發帶來不必要的麻煩(因爲開發者有可能會使用強類型語言)。要解決這個問題可以從源頭入手,在設計數據庫的時候,儘量給每個字段都加上“not null”約束或者設置合理的默認值約束。

其他問題

  1. 更新提示問題:設計一個每次使用系統首先要訪問的API,該API會向移動端返回系統更新的相關信息,這樣就可以提升用戶更新App了。
  2. 版本升級問題:API版本升級時應該考慮對低版本的兼容,同時要讓新版本和舊版本都能夠被訪問,可以在URL中包含版本信息或者在將版本號放在HTTP(S)協議頭部,關於這個問題有很多的爭論,有興趣的可以看看stack overflow上面對這個問題的討論。
  3. 圖片尺寸問題:移動端對於一張圖片可能需要不同的尺寸,可以在獲取圖片時傳入尺寸參數並獲取對應的資源;更好的做法是直接使用雲存儲或CDN(直接提供了圖片縮放的功能),這樣可以加速對資源的訪問。

文檔撰寫

下面以設計評論接口爲例,簡單說明接口文檔應該如何撰寫。

首先,我們可以定義全局返回狀態碼。

返回碼 返回信息 說明
10000 獲取評論成功
10001 創建評論成功
10002 無法創建評論 創建評論時因違反審覈機制而無法創建
10003 評論已被刪除 查看評論時評論因不和諧因素已被刪除
10004 …… ……
  1. 獲取文章評論。

    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": "樓上說得好",
                /* ... */
            }
        ]
        /* ... */
    }
  2. 新增文章評論。

    POST /articles/{article-id}/comments

    開發者:王大錘

    最後更新時間:2018年8月10日

    標籤:v 1.0

    接口說明:爲指定的文章創建評論

    使用幫助:暫無

    請求參數:

    參數名 類型 是否必填 參數位置 說明
    userId 字符串 消息體 用戶ID
    key 字符串 請求頭 用戶的令牌
    content 字符串 消息體 評論的內容

    響應信息:

    {
        "code": 10001,
        "message": "創建評論成功",
        "comment": {
            "pubDate": "2018年7月31日",
            "content": "小編是不是有病呀"
            /* ... */
        }
        /* ... */
    }

提示:如果沒有接口文檔撰寫經驗,可以使用在線接口文檔編輯平臺RAP2YAPI來進行接口文檔撰寫。