看到API你會想起什麼?是接口、第三方調用、仍是API文檔?初看你可能會以爲這太熟悉了,這不是系統開發平常系列嗎?但你仔細想想,你會發現API的概念在你腦海裏是如此的模糊。如何你經過搜索引擎檢索API,你會看到相似這樣的信息:API——Application Programming Interface(應用程序編程接口),這太抽象了。接下來,我將結合在開發中總結的一些經驗,以通俗的方式聊聊API、REST API、RESTful API以及Web Service這四者之間的聯繫與區別。html
什麼是API?這裏引述維基百科給出的定義:應用程序接口(英語:Application Programming Interface,縮寫:API;又稱爲應用編程接口)是軟件系統不一樣組成部分銜接的約定。這個對API的定義太過於普遍和抽象,而通俗的講,API是一段應用程序與另外一段應用程序相互「交流」的方式(協議)。在Web應用程開發中,API是咱們經過網絡進行數據檢索的一種主要方式,API文檔將告知你檢索數據的URL列表、查詢參數、請求方式以及響應狀態,其目的是下降Web應用程序開發難度,共享兩個應用程序之間的數據(文本、音頻、視頻、圖片等),而屏蔽其內部複雜的實現細節。web
REST是Representational State Transfer的縮寫,直譯過來就是:表述狀態的轉移。REST API是一組關於如何構建Web應用程序API的架構規則、標準或指導,或者說REST API是遵循API原則的一種架構風格。REST是專門針對Web應用程序而設計的,其目的在於下降開發的複雜度,提升系統的可伸縮性。下面是設計REST風格的系統架構時須要知足或者遵循的一些基本條件和原則:算法
如今,瞭解了API和REST API的基本概念,那這二者之間有什麼異同?若是按照數學上集合的概念來解釋API與REST API之間的聯繫與區別,API是REST API的超集,REST API 是API的子集;全部的REST API都是API,但不是全部的API都是REST API。更通俗的解釋是:全部的男人都是人,但不是全部的人都是男人。數據庫
在第一小節中,瞭解了什麼是REST API,接下來聊聊REST API與RESTful API之間的異同。不少初學者很容易將這二者等同起來,認爲RESTful API就是REST API,這多是單純的從字面上去理解了,當你深刻的去了解二者的本質後,你會發現其實否則。REST API是Web API設計的一種規範或者指導原則,而RESTful API則是這中架構設計原則或者規範的一種具體實現方式。也就是說,RESTful API是REST API的非正式實現方式,由於實現REST API的方式有不少,RESTful API只是其中一種,且沒有徹底知足REST API的全部設計原則,每一個開發者在實現REST 架構時的則重點都會有差異。編程
不少初學者容易將REST API與RESTful API二者的概念搞混淆,我想可能只是看字面意思,而沒有關注它們自己的含義(就像認識中文字同樣,有邊讀邊,無邊讀中間,斷章取義了)。這就比如不少人會把變性人等同於女人,變性人可能五官的表象看起來和女人同樣,但變性人不能生育,它只是知足了定義一個女性的大多數條件(實現),但本質上不是女人。api
接下來,經過一個簡單的例子以加深對REST API和RESTful API的理解。下面將給出一個執行CURD操做的RESTful API設計案例:緩存
說明:resource代指某種資源的名稱,能夠時student(學生)、teacher(老師)、book(書籍)等等,一般使用名詞來表示;{id}則代指某種資源的惟一標識符(resource identifier)網絡
下面是一個具體的小例子,以學生管理爲例,設計學生管理的API。學生資源包括ID,姓名和所學課程信息,學生資源信息以下:架構
如今,咱們須要將學生數據保存到數據庫,而後執行查詢、修改和刪除學生數據的操做。學生管理API的使用者調用的API以下:框架
前面的內容說到,API共享數據資源,而屏蔽內部實現,API的使用者(客戶端)關注的是資源(讀懂數據),並不須要瞭解API內部構造;API的提供者(服務端)只關注本身的內部實現,而不關係API使用者(客戶端)的狀態。爲了加深對這一律唸的理解,下面給出學生管理API的內部實現示例:
說明:
示例代碼是基於Spring MVC進行實現的。
除了上述的內容以外,你還能夠經過提供鍵值對的方式對查詢數據進行過濾,如獲取全部的學生數據時,只想獲取性別爲女性的學生數據,則能夠經過這樣的方式來完成:
[GET] http://www.example.com/students?gender=female
複製代碼
Tip:若是API擁有對數據過濾的功能,對應服務端的API實現代碼也須要作調整。
在前面的內容中,咱們提到RESTful API是REST API的非正式實現方式或規範。爲何這麼說呢?由於在RESTful API的設計中,咱們徹底能夠經過GET的方式完成CURD操做,也能夠經過DELETE行爲來建立資源,經過POST行爲來修改資源,它的實現方式並不嚴謹或者說並無嚴格按照REST API提出的約束條件來進行。因此說RESTful API是REST API的非正式實現方式。
如萬維網聯盟(W3C)所述,Web Service提供了在各類平臺和/或框架上運行的不一樣軟件應用程序之間能夠進行互操做的標準方法。Web Service的特色是具備良好的互操做性和可擴展性,以及因爲使用XML而能夠對程序處理過程進行描述。它們能夠以鬆散耦合的方式組合不一樣的服務以實現複雜的操做。提供簡單服務的程序能夠經過相互交互,以提供複雜的增值服務。
兩個Web Service之間主要經過HTTP網絡協議進行通訊,如咱們熟知的SOA(面向服務的體系架構),主要依賴於XML-RPC和SOAP(Simple Object Access Protocol,即簡單對象訪問協議)。
Tip:千萬不要將SOA(面向服務體系架構)和SOAP(簡單對象訪問協議)搞混,前者是一種架構設計形式,後者是一種數據交換協議。
簡單的一個示例:假設一個Web Service A提供容許其餘應用程序經過URL獲取用戶信息的功能:[GET] www.abc.com/{id}。id是用戶的… 沒有任何關係,只要可以解析出服務A返回的XML文檔便可。這樣,應用程序之間交換數據就能夠不用依賴於具體的語言和環境。這就比如不一樣國家不一樣語言的人,只要可以知曉對方語言的語法結構,兩我的就能夠進行交流。
使用Web Service有以下的幾個優勢:
目前,Web Service主要有兩大流派:
下面,經過一張表格來對比REST與SOAP之間的異同:
如上所述,咱們瞭解了什麼是API,什麼是REST API,什麼是RESTful API以及Web Service的相關概念。API表明應用程序編程接口,是一種較爲寬泛的定義或者說是一種協議,做爲軟件程序之間相互通訊的接口而存在。REST API是API的一個子集,全部的REST API都是API;RESTful API是對REST API架構風格的一種非正式實現方式。API與Web Service都是服務提供者和服務消費者之間的通訊手段。最後,爲了可以快速的識別API與Web Service之間的差別,將這兩種手段的不一樣之處整理成對照表以下: