[轉(zhuǎn)] RESTful API

先說說API

API大家應(yīng)該都知道吧,簡稱接口嘛。隨著現(xiàn)在移動互聯(lián)網(wǎng)的火爆,手機軟件,也就是APP幾乎快爆棚了。幾乎任何一個網(wǎng)站或者應(yīng)用都會出一款iOS或者Android APP,相比網(wǎng)頁版的體驗,APP確實各方面性能要好很多。

那么現(xiàn)在問題來了。比如QQ空間網(wǎng)站,如果我想獲取一個用戶發(fā)的說說列表。

QQ空間網(wǎng)站里面需要這個功能。

Andoid APP里面也需要這個功能。

ios APP里面也需要這個功能。

現(xiàn)在就有三套,那么按照傳統(tǒng)的開發(fā)網(wǎng)站的結(jié)構(gòu),你就要寫3套獲取用戶說說列表的功能。也就是需要在3個地方都寫連接MySQL,查詢mysql,可想而知是非常浪費時間和經(jīng)歷的,而且安全性能很差,你可以想象你把連接mysql的配置寫在android里面,是多么危險的一件事情。人家破解出來分分鐘。

所以!當當當當! API 就誕生了~

API就是為了解決這種情況而誕生,由一個地方統(tǒng)一提供API接口,哪個平臺想使用就直接調(diào)用這個API接口來或許信息就可以了。

比如:獲取QQ空間用戶發(fā)的說說列表:

QQ Zone web: https://api.qzone.com/user/getUserFeedList?from=web

QQ Zone Android: https://api.qzone.com/user/getUserFeedList?from=android

QQ Zone iOS: https://api.qzone.com/user/getUserFeedList?from=ios

你看。我就寫了一次代碼接口。就可以供3個地方同時使用,我僅僅是用了from參數(shù)加以區(qū)別,可能每個平臺想要的數(shù)據(jù)不一樣。

這樣不僅更加安全,快捷,最主要是分工更快速了。一個人專門寫接口,另外一個人只需要知道如何調(diào)用就可以了,完全不需要知道是如何實現(xiàn)的。

RESTFUL API

上面簡單的說了API 的由來以及使用API帶來的好處,好東西大家一用就會出問題,就像PHP一樣,用的人一多就會出現(xiàn)各種不同的規(guī)范,API也一樣,雖然都是調(diào)用API,但是,寫法卻千差萬別,維護起來很是麻煩,比如:同樣是調(diào)用QQ空間用戶說說列表,就可能有以下好幾種寫法:

https://api.qzone.com/user/getUserFeedList?from=web

https://api.qzone.com?m=user&c=getUserFeedList?from=web

https://qzone.com/api/user/getUserFeedList?from=web

https://qzone.com?m=api&c=user&a=getUserFeedList?from=web

你看,看上去千差萬別,各種狀況都有,后期維護是個大問題,再就是請求方式也不對,有些喜歡用POST ,然后所有的請求都是POST, 有些喜歡用GET ,不管多大的數(shù)據(jù)量都用GET去請求,可想而知,全都亂了套。

那么有沒有一個行業(yè)標準來規(guī)范和約束這些具體的東西呢?或者說是實施的比較好的?當然有。RESTFUL API的結(jié)構(gòu)設(shè)計就誕生了。

REST 意思是:表述性狀態(tài)傳遞(英文:Representational State Transfer)

簡單來說,RESTful API 是基于HTTP協(xié)議產(chǎn)生的一種相對簡單的API設(shè)計方案,屬于無狀態(tài)傳輸。RESTful 的核心是 everything is a “resource”,所有的HTTP action,都應(yīng)該是相應(yīng)resource上可以被操作和處理的,而API 就是對資源的管理操作,而這個具體操作是由 HTTP action 指定的。

RESTful API 是目前比較成熟的一套網(wǎng)絡(luò)應(yīng)用程序的API設(shè)計理論,RESTful API 的出現(xiàn)使前后端設(shè)備之間進行交互時可以按照這個設(shè)計更規(guī)范、更容易交流。

在一個RESTful系統(tǒng)里,客戶端向服務(wù)端發(fā)起索取資源的操作只能通過HTTP協(xié)議語義來進行交互。最常用的HTTP協(xié)議語義有以下5個:

  • GET : 從服務(wù)器取出資源(一項或多項)
  • POST:在服務(wù)器新建一個資源
  • PUT:在服務(wù)器更新資源(客戶端提供完整資源數(shù)據(jù))
  • DELETE:從服務(wù)器刪除資源
  • HEAD : 從服務(wù)器獲取報頭信息(不是資源)

一些API設(shè)計者在使用這5個HTTP協(xié)議請求方法時存在語義混用的情況,某些該用PUT請求的資源,卻使用了GET。下面就簡單介紹一下每個HTTP動詞使用場景和對服務(wù)器產(chǎn)生的影響。

0.jpeg
1.jpeg
2.jpeg
3.jpeg

【注:通常說到冪等性時,還會說安全性(只讀)。GET、HEAD和OPTIONS均被認為是安全的方法,而PUT、POST、DELETE等請求都是不安全的(會修改數(shù)據(jù))。】

WEB服務(wù)接收與返回的互聯(lián)網(wǎng)資源類型

客戶端與服務(wù)端進行交互響應(yīng)時,需要規(guī)定雙方能夠接受何種類型的媒體表現(xiàn)形式,最常見的以application開頭的媒體格式類型有:

  • application/json: JSON數(shù)據(jù)格式
  • application/xhtml+xml:XHTML格式
  • application/xml: XML數(shù)據(jù)格式
  • application/atom+xml:Atom XML聚合格式

部分小白看到這兒可能就會迷糊:RESTful Api 設(shè)計與上面提到的資源類型有何關(guān)系?

我們以地下黨和接頭人對接的場景為例,解釋下,什么是資源類型?它和API設(shè)計有何關(guān)系:

地下黨A和接口人B見面,雙方約定,以敲三下門作為接頭暗號,暗號對了就放行。

(這里敲門、敲三下的約定就類似于RESTful Api設(shè)計里面的“HTTP協(xié)議”,只有按照這個協(xié)議約定,合作才能繼續(xù)進行。)

聽到三聲敲門聲,雙方確定是自己人。事先,雙方就已經(jīng)確定以何種方式與對方交流最新情報:中文?英文?粵語?這些方式必須是對方能接收并破譯的形式。

(這里的中文、英文、粵語就類似于客戶端和服務(wù)器交互時使用的資源類型,API設(shè)計中只有使用合理的資源類型,才能讓客戶端獲取到可以讀取的資源。)

怎么樣?這么一解釋,是不是通俗易懂啦!

API設(shè)計原則

1、URL

  • URL中應(yīng)盡量使用名詞,盡量避免使用動詞;

  • 應(yīng)該盡量將API部署在專用域名之下;

https://api.example.com

  • 如果確定 API 很簡單,不會有進一步擴展,可以考慮放在主域名下;

https://example.org/api/

  • 應(yīng)該將API 的版本號放入URL,或者將版本號放在HTTP頭信息中;

https://api.example.com/v1/

2、路徑

路徑又稱"終點"(endpoint),表示API的具體網(wǎng)址。

在RESTful架構(gòu)中,每個網(wǎng)址代表一種資源,所以網(wǎng)址中不能有動詞,只能有名詞,而且所用的名詞往往與數(shù)據(jù)庫的表格名對應(yīng)。一般來說,數(shù)據(jù)庫中的表都是同種記錄的”集合"(collection),所以API中的名詞也應(yīng)該使用復(fù)數(shù)。

舉例來說,有一個API提供動物園(zoo)的信息,還包括各種動物和雇員的信息,則它的路徑應(yīng)該設(shè)計成下面這樣。

3、找到特定領(lǐng)域的媒體類型,根據(jù)特定的領(lǐng)域來設(shè)計媒體類型

在《RESTful Web APIs》一書中提及到當你想要發(fā)布一個API的時候,首先要做的就是找到一個已有的特定領(lǐng)域特定設(shè)計。重復(fù)造輪子是沒有意義的。

在數(shù)據(jù)返回格式方面,大部分的網(wǎng)站優(yōu)先提供Xml、JSON的數(shù)據(jù)返回,Google定義的GData就是在Atom基礎(chǔ)上作了擴展,還有一些網(wǎng)站提供了php的數(shù)據(jù)返回。

4、其他

  • 易拓展性:一個易拓展的API設(shè)計方案,可以讓你延緩實現(xiàn)功能,因為“如果需要的話,后面再添加也很方便”。不需要的功能就不添加;

  • 靈活性:API應(yīng)該具有足夠的靈活性來支持上層UI;

  • 可移植性:這個API可以運行在任何操作系統(tǒng)上;

  • API應(yīng)該對程序員友好,并且在瀏覽器地址欄容易輸入;

參考資料:

RESTful API 設(shè)計最佳實踐

RESTful API 設(shè)計指南

https://www.zybuluo.com/phper/note/79184

https://sanwen8.cn/p/2ddcbVD.html

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

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,008評論 25 709
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,551評論 19 139
  • 從ES5開始,對象的每一個屬性都具備了屬性描述符。 對u象的屬性描述符是真的常見,這里就簡要概括一下吧。對象的屬性...
    BIGHAI閱讀 372評論 0 0
  • 人的物質(zhì)生活,是很容易滿足的。但精神追求卻是永遠無止境的。 這倒不是說,我們不屑于物質(zhì)的多彩;而是因為,相對于物質(zhì)...
    流小云閱讀 300評論 0 0
  • 我感到疼痛來自肋骨, 也許已經(jīng)斷裂, 包藏在戰(zhàn)栗的血肉中, 一柄生銹的短劍, 一份打磨圓潤的憎恨, 在夜色中一點點...
    三水林楓閱讀 758評論 28 36

友情鏈接更多精彩內(nèi)容