前言
什麼是 API?
什麼是 SDK?
兩者之間有何關係?
歡迎來到本次的每周一問系列。
既然點進來了,相信你或多或少都聽說過這兩個名詞了,因此,在為你解答之前,讓我們先從一個例子出發。 假如你想開發一個 OCR 應用(通俗的說就是文字識別應用),他的功能是識別用戶上傳的一張圖片,然後將圖片中的文字識別出來返回給用戶。如下圖所示:

通常,OCR 應用的後端服務都會部署在雲上,那麼我們應該如何在移動應用程序與基於雲的服務之間進行通信呢?
這就是 API 和 SDK 的用武之地了。
API
API 的特點
通信
首先我們要明白的是 API 是和通信有關的,是用於應用(服務)與其他應用(服務)對話所定義的協議。在上述例子中,你可以簡單理解為 API 是 OCR 應用和雲端服務之間溝通的橋樑。
那麼 API 到底是什麼?
API 全稱 Application Programming Interface,即「應用程序介面」。
一般是指一些預先定義的函數,目的是供應用程序與開發人員基於某軟體或硬體得以訪問一組程序的能力,而又無需訪問源碼,或理解內部工作機制的細節。
以 Java 為例,當你想要實現一個數組排序的功能時,你是會先手寫一個排序演算法,還是直接使用Arrays.sort()函數?我想你心裡是有答案的。
抽象
其次,我們要理解,API 的另一個重要特點——抽象。
抽象指的又是什麼?
還是以這個 OCR 應用為例,當我們在使用雲端提供的文字識別能力時(比如百度文字識別),他的背後可能會有成千上萬的代碼,比如提供識別能力的機器學習的代碼、提供 Web 能力的後端代碼等等。

但是你作為一個 APP 的開發者,你需要去看這些代碼是怎麼寫的嗎?難道不知道背後的源碼就不能調用百度提供的文字識別能力了嗎?當然不是。
通常服務商已經給你提供了文檔,告訴你如何去調用相應服務,只要你按照他的要求來即可。

因此,在你的 APP 和 OCR 服務之間,API 抽象出所有複雜的邏輯,簡化了調用過程,這使得你只需要考慮獲取所需的數據即可。
標準化
API 是標準化的,這意味著存在有關如何定義 API 的行業標準,比如 SOAP、REST、GraphQL 等。
我在《你的第一本 SpringBoot 書》[1]中寫到什麼是 RESTful API,有興趣的小夥伴可以點擊閱讀,這是我正在寫的一本 SpringBoot 入門教程,目前還沒完工,歡迎讀者們不要吝嗇自己的建議 。
API 的構成要素
那麼,API 通常由什麼組成呢?
首先,我們要發送一些數據到雲端,即所謂的「請求」。
從本地應用發請求到雲端,我們需要分幾步完成,以 REST 為例。
對於 REST API 調用請求,第一步是指定傳輸的方法,通常是和 HTTP 方法對應的,如下圖所示:

當你想要上傳一張圖片時,通常會使用 POST 方法,然後是傳遞一些參數,包括請求的內容(圖像本身)。然後加上需要請求的地址,即可構成一個完整的請求。如下圖所示:

之後,伺服器再以 JSON 等形式將數據返還給你,在你使用的雲服務的文檔中也會有所標註。

SDK
說了這麼多,你應該對 API 有所了解了,那麼這時候問題就來了,作為開發人員,你如何在實際的項目中調用 API?
你要自己構造 HTTP 請求、拼接 URL、添加需要的參數、處理返回的 JSON 對象,麻煩嗎?
麻煩。

那有沒有什麼好的辦法簡化這些操作,使得我只需要給一張圖片然後就給我返回結果的呢?
自然是有的,這就是接下來我們要說的 SDK 了。
SDK 全稱 Software Development Kit,軟體開發工具包。
一般都是一些軟體工程師為特定的軟體包、軟體框架、硬體平台、操作系統等建立應用軟體時的開發工具的集合。
通俗來講就是第三方服務商提供的實現產品軟體某項功能的工具包。例如 JDK 就是一種 SDK。
還是以上面的 OCR 應用為例,如果使用了某廠商的 SDK 服務,那麼我們連 HTTP 請求的構建都不需要了,僅調用一個方法,可能的代碼如下圖所示。
OCRResult res = ocrClient.ocr("pic.jpg").getResult();
通過調用這行代碼,SDK 會自動封裝 API 請求,而且作為響應,你獲得的結果也不一定是 JSON 對象,也有可能是代碼,例如上述代碼段里的OCRResult,這是因為 SDK 也已經將 JSON 對象反序列化成你需要的對象,比如一個 Java Model。
SDK 相當於開發集成工具環境,API 就是數據介面。API 可以在 SDK 提供的「環境」里請求。同樣的,這裡的「環境」也是一個抽象的概念。如果不使用 SDK,也可以直接調用 API,只不過,這個環境就要由開發者自己實現了。
區別
其實從上面的內容,我們也已了解到,API 在更多場合下更像是 SDK 的一個子集,他們的區別如下:
•API 通常是一個函數,有特定的功能;而 SDK 是一個很多功能函數的集合體,更像是一個工具包。•API 通常扮演數據介面的形象,SDK 相當於一個工具環境,通常是需要在 SDK 的環境下調用 APl。•SDK 相較於 API 封裝層次更高。
原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/315410.html