1. 程式人生 > >轉: 如何理解API,API 是如何工作的

轉: 如何理解API,API 是如何工作的

閱讀本文大概需要 5~6 分鐘

大家可能最近經常聽到 API 這個概念,那什麼是API,它又有什麼特點和好處呢?

wiki 百科鎮樓

…[APIs are] a set of subroutine definitions, protocols, and tools for building application software. In general terms, it’s a set of clearly defined methods of communication between various software components.

翻譯:API 是用於構建應用程式軟體的一組子程式定義,協議和工具。一般來說,這是一套明確定義的各種軟體元件之間的通訊方法。(回來再看(。・∀・)ノ)。

本篇文章中,我會用淺顯的比喻來解釋API,介面(interface),協議(protocol)這些基本概念。enjoy it ! 

假設你有一個銀行


這裡寫圖片描述 
你有一個倉庫來存錢,一個記賬本來記各種業務。一個簡單的管理銀行的方法是直接將許可權給所有人,讓客戶自己動手完成各種業務。

這種模式下,一個客戶想要存錢的話,他需要:

  1. 拿著錢去銀行
  2. 開啟倉庫把錢放進去
  3. 把這筆業務寫到記帳本上
  4. 離開銀行

顯然這存在著問題:

  1. 想開開倉庫門需要廢很大力氣,並不是所有的人都能開啟,還有些人不識字不會記賬。
  2. 在這個模式下,我們假定所有人都是誠實的,顯然這並不成立。(說不定哪一個人存了100塊錢記賬的時候寫了10000塊)。

這時你遇到麻煩了。

僱一個櫃員


要是我們僱一個體格棒,辦事還麻利的人來處理開倉庫,記賬的問題呢?

小娜登場了。

現在模式為:建一個櫃檯將倉庫和記賬本和顧客分開,這樣顧客就不需要再去管倉庫和記賬本了。想存錢的話直接找小娜就行。

這裡寫圖片描述

這種模式下,要是有人想存錢,他們必須:

  1. 拿錢去銀行
  2. 告訴小娜我是 MMM 我想要存¥¥¥。
  3. 小娜開啟倉庫把錢放進去
  4. 小娜把業務(transaction )記錄好
  5. 告訴你業務辦好了
  6. 顧客離開銀行

現在不會發生打不開倉庫門或者是記錯賬的情況了,你覺得很滿意。

到此我們引出今天的主角API( Application Programming Interface),它能夠幫你實現輕鬆的和其他軟體元件(如伺服器,作業系統等)的互動。

在上面舉的例子中,我們僱一個收納員幫顧客解決了開倉門,放錢,記賬這一系列繁瑣的過程。這大大節省了顧客的時間,同時提高了銀行的效率。同理,如果我們將操作的具體實施步驟抽象化,這將會大大降低開發人員的負擔(去記憶所有的步驟花費的力氣),從而大大提高了效率。

另外的好處是,只要他們遵循了同一個協議,元件可以交換或者是改變。銀行不需要知道時哪一個顧客或者說顧客是怎麼進來的,顧客也不需要知道銀行拿自己的錢去做什麼了。只要負責的櫃員在這裡並做好工作,整個流程將會繼續工作。

API 應用範圍很廣:從作業系統中簡單的 fork() 到我們接觸的百度地圖API,和風天氣API,又或者是邢遠分享的段子,這些 API 都大大簡化了程式設計師的工作。

銀行裡有什麼


這裡寫圖片描述

你可能已經注意到了銀行分成了兩個區域:顧客在前臺排好隊來辦理業務,後臺完成各種對錢的操作。在中間層,前臺和後臺發生了互動, 雙方都不能越界 ,互動只能發生在中間的區域。

在 API 術語裡面,我們管中間的這塊區域叫做介面 Interface ;在這裡各個部分發生互動。在我們的銀行中,前臺和後臺都同意並且規定使用 Interface 來交換資訊。

現在,我們假定 Bob 想要取錢。他到了櫃檯找到了小娜,小娜知道該怎樣去取錢,她取好了之後告訴了 Bob。

這裡寫圖片描述

Bob 這時候又問:“你知道今天的股票行情嗎”

小娜:????WTF ?

在這個例子裡面,小娜知道怎樣取錢和存錢 , 但是她不知道如何去給Bob查查今天的股票行情是怎樣的。這個例子引出了另一個概念 協議(Protocol)。

在 API 術語中,協議 是規定了各部分之間如何進行交流的一系列規則的集合。各部分之間想要完成互動必須理解並且遵守同一個協議。

同時,我們注意到了交換時用的是中文。如果Bob 對小娜說「我想撳五百蚊出嚟呀唔該」,小娜不懂廣東話,所以沒法理解Bob說的是什麼,這又引出了另一個概念 格式(Format)

在程式設計師的世界裡,通用的格式包含 XML 和 JSON

最後,讓我們假設銀行想要擴充套件業務到股市,這時候就需要一位特殊的接待員來處理與股票相關的業務了,這時,小冰就登場啦。 
這裡寫圖片描述

在 API 術語裡面, API 端點 通常是指在同一個介面中提供特定功能子集的服務提供者。在這種情況下,小冰和小娜都是端點。(小冰和小娜是同一個櫃檯不同功能的提供者)不同的端點可以有不同的協議和不同的格式。

總結起來:介面是不同元件進行互動的地方。協議是一系列規定了他們之間怎樣進行互動的規則。格式定義了他們通過什麼進行交流(JSON或者是XML),端點可以在同一個接口裡面提供不同的功能。

櫃員還能幹什麼?


到現在我們把 API 的基礎知識過了一遍,接下來我們再來談一談 API 的其他特徵。w(゚Д゚)w

現在又有客戶來取錢了,他想要取¥10000。 
這裡寫圖片描述

首先,我們可以指示小娜在操作前先去確認一下 Bob 是否真的有這麼多錢。(API 能確認所有的操作都是合法的。)

小娜查到 Bob 賬戶裡只有一百塊了,告訴 Bob 餘額不足。(在發生錯誤的時候 API 會根據錯誤報告機制發出指示,減輕開發人員的負擔。)

Bob 認為肯定是哪裡出錯了,他要求銀行給他列一張表,給出他所擁有的每個賬戶上的餘額。結果顯示一共有 200 個賬戶。把他們一下子全給列出來不太實際,所以小娜每次給 Bob 看十個賬戶,看完了之後再來十個。(這叫做分頁(pagination),可以節省頻寬和伺服器資源,因為你不需要一次獲取資料集中的所有內容。)

如果 Bob 只想要知道他某一個賬戶中的餘額的話,他可以要求小娜只給她看那個的(這稱為過濾(filtering),它還有助於節省頻寬和資源,並且更易於導航。)

在檢查完所有賬戶之後,鮑勃現在知道他的帳戶中確實沒有10000美元。他知道愛麗絲購買股票並獲得了大量資金,於是偽裝成愛麗絲並重新進入銀行。他告訴莎莉:“我是愛麗絲,我想從我的賬戶中提取10000美元。” 小娜識破了他的騙局。(API中內建授權和訪問控制,以確保只有授權人員才能訪問特定資料。)

最後,在試圖從銀行拿到10000美元失敗後,他想報復小娜,他進入銀行並多次從賬戶中提取0.01美元。 (我們可以實施速率限制來控制伺服器資源的使用,以確保使用者不會濫用服務。)

API 通常都會被設計具有這些功能,它可以充當防火牆,在保護您的資源免受濫用的同時允許合法請求通過。

再讀Wiki


…[APIs are] a set of subroutine definitions, protocols, and tools for building application software. In general terms, it’s a set of clearly defined methods of communication between various software components.

API 是用於構建應用程式軟體的一組子程式定義,協議和工具。一般來說,這是一套明確定義的各種軟體元件之間的通訊方法。

現在是不是頭腦裡對這個概念清晰多了呢。

 

轉載: https://blog.csdn.net/cumtdeyurenjie/article/details/80211896   作者: