SDK和API的區别

2022-02-23
 以前隻知道不管是API還(hái)是SDK,直接調用就(jiù)行了,還(hái)沒有具體想過其中的區别:
  SDK和API都是類似于公共服務的東西(xī),都代表的是一(yī)種封裝,隻是封裝的形式不一(yī)樣:
  SDK的封裝是在客戶端層面的一(yī)個(gè)library(也叫做“包”或者“庫”),這個(gè)library提供一(yī)些客戶端API接口,類似于已經寫好了的函數,你隻需要調用它就(jiù)好了。SDK暴露出來的接口都是和語言相(xiàng)關的,如果SDK是用Java寫的,就(jiù)需要用Java去調用那個(gè)函數;如果是SDK是用Objective-C寫的,就(jiù)需要用Objective-C去調用那個(gè)函數。
  API是封裝在服務端層面的library,從(cóng)網絡服務的層面暴露出一(yī)些API接口,提供給使用這些服務的人去調用。因為(wèi)封裝在服務的層面,傳輸數據用的是網絡協議(常用HTTP/TCP),就(jiù)不需要管他是用什麽語言實現的;
  舉個(gè)SDK的例子:SDK和API都是服務的消費(fèi)者;提供SDK和API的都是服務的提供者,會(huì)根據消費(fèi)者的意願來定義SDK和API。
  比如支付寶,很多(duō)App、網站(zhàn)等消費(fèi)者都需要使用支付這個(gè)功能(néng)/服務,但是又(yòu)不想自(zì)己去開(kāi)發這個(gè)東西(xī),那麽支付寶就(jiù)說“你們告訴我,你們需要使用的環境是什麽樣的”;有人說“我是App,Android寫的”,有人說自(zì)己是iOS,有人說“我是Web的”,還(hái)有人說我是Windows的,那麽支付寶說:“沒問題,Android的我有Android的SDK,你把這個(gè)SDK嵌入到(dào)你的代碼裡(lǐ),我有一(yī)些Java的接口,Java接口裡(lǐ)面有個(gè)函數叫pay,然後你傳一(yī)些值給pay就(jiù)可以了;如果你是iOS的,我還(hái)有另外一(yī)個(gè)叫iOS支付寶的SDK,你把它嵌入到(dào)你的iOS的App裡(lǐ)面,然後裡(lǐ)面有個(gè)Objective-C寫的函數,也叫pay,同樣傳參數進來就(jiù)可以了;如果你是Web的就(jiù)可能(néng)有個(gè)js的SDK,嵌入到(dào)你的HTML代碼裡(lǐ)就(jiù)好...”
  那SDK都有哪些缺點呢(ne)?
  缺點一(yī):
  SDK的不便性在于,他和App一(yī)樣,是需要升級的,比如修複某些bug,就(jiù)需要讓所有用了舊(jiù)SDK的商戶在更新自(zì)己産品的時候采用新的SDK。
  但是SDK的升級是做不到(dào)強制性的,所以SDK提供方的人就(jiù)很痛苦,因為(wèi)需要向下(xià)兼容很多(duō)個(gè)版本,有的時候會(huì)直接通(tōng)知死都不升級的消費(fèi)者商家說:“老版本的我不支持了,要用的趕緊升級!”強勢的SDK提供方,比如Facebook,會(huì)提前一(yī)年(nián)和你說某個(gè)SDK一(yī)年(nián)後不支持了。但實際上(shàng),就(jiù)算(suàn)給了一(yī)年(nián)的時間,很多(duō)消費(fèi)者廠商還(hái)是很難完全更新他們使用的SDK,因為(wèi)有時候采用了舊(jiù)版本SDK的App的用戶數目太大,總有一(yī)些量的用戶并不願意升級。
  缺點二:
  因為(wèi)SDK是完全封裝好的,提供的是一(yī)個(gè)二進制的包,使用SDK的消費(fèi)者廠商完全不知道他的實現細節。
  有時候使用一(yī)些小(xiǎo)廠開(kāi)發的SDK非常有風險,如果其中有一(yī)些“手腳”,消費(fèi)者是不知道的。上(shàng)次有個(gè)做廣告變現的小(xiǎo)廠開(kāi)發了一(yī)款可以幫助變現的SDK,變現方式是用了他的SDK之後,彈一(yī)個(gè)廣告給用戶,如果有用戶點廣告後會(huì)得到(dào)廣告提成。但是這個(gè)小(xiǎo)廠接廣告的模式是直接下(xià)載apk,根據規定是不能(néng)直接繞開(kāi)Google Play去下(xià)載apk,Google因為(wèi)這個(gè)原因,把所有集成了這個(gè)SDK的App全都下(xià)架了。
  所以,如果SDK的提供方做了一(yī)些違反政策的事(shì)情,就(jiù)會(huì)把完全不知情的你牽連,所以很多(duō)人不願意集成小(xiǎo)廠的SDK,隻願意集成Facebook,Google之類大廠的SDK。
  缺點三:
  理論上(shàng),SDK提供方可以做到(dào),知曉消費(fèi)者廠商的用戶規模。
  因為(wèi)消費(fèi)者廠商的用戶也算(suàn)是提供方的用戶,所以如果SDK提供方在實現中加入一(yī)些數據上(shàng)報(bào)的動作,技(jì)術(shù)上(shàng)來說是完全ok的。而用戶規模、用戶數據等都是非常隐私的東西(xī),消費(fèi)者廠商肯定是不想被别人知曉的。
  在實際的開(kāi)發中,為(wèi)什麽要用API呢(ne)?
  因為(wèi)有時候,某些服務隻有某些小(xiǎo)廠才提供,Google類的大廠并不可能(néng)提供所有的服務。
  這個(gè)時候,API來了!可以直接用網絡API,而不是在自(zì)己代碼裡(lǐ)集成SDK。意思是,pay的函數自(zì)己寫,這樣由消費(fèi)者自(zì)己控制實現的原理。
  舉個(gè)例子,支付寶除了SDK,也會(huì)提供像API的網絡接口。如果你不想集成SDK的時候,也可以自(zì)己花時間去實現支付的邏輯,API提供方可以告訴你,需要先調用這個(gè)API,得到(dào)某個(gè)信息之後,再調用另外一(yī)個(gè)API,拿到(dào)另外一(yī)個(gè)信息,再調用下(xià)一(yī)個(gè)API,拿到(dào)下(xià)一(yī)個(gè)信息...這中間可能(néng)有好幾個(gè)步驟,最後完成pay。
  相(xiàng)比之下(xià),如果用SDK的話,可能(néng)隻需要寫一(yī)句話就(jiù)好;
  如果使用API的話,每句話都需要自(zì)己寫,可能(néng)需要幾百行代碼,但是實現邏輯都可以自(zì)己控制,中間停住也行,再插入一(yī)個(gè)廣告也行....界面怎麽跳轉、有沒有動畫(huà)都可以自(zì)己決定,隻要最後調用提供方的API就(jiù)可以了,所以很多(duō)廠商覺得這樣的形式也挺好的,隻是要求會(huì)比較高(gāo)一(yī)點。
  另外還(hái)有一(yī)個(gè)不用SDK,而用API的可能(néng)原因:有時候,由于某些服務提供方自(zì)己并沒有封裝SDK,而API相(xiàng)對來說比較通(tōng)用,比較方便提供。
  舉個(gè)例子,如果消費(fèi)者是windows的平台環境,那麽SDK提供方就(jiù)需要提供windows的SDK,但是如果提供方公司并沒有開(kāi)發windows的程序猿,就(jiù)隻能(néng)讓服務消費(fèi)者使用API。
  那什麽時候一(yī)定要用SDK呢(ne)?是不是SDK能(néng)做到(dào)的事(shì)情,API都能(néng)做到(dào)?
  其實是不會(huì)的。有些SDK裡(lǐ)面會(huì)提供界面,比如Facebook提供變現的SDK中,會(huì)固定他的原生(shēng)廣告形式,比如大圖、文字的字号大小(xiǎo)都是固定的,頁面會(huì)以他規定的方式展現出來。像這樣的時候,必須要集成他的SDK,因為(wèi)界面和規範已經寫好在了SDK裡(lǐ)面....
  如果是API的話,你可以拿到(dào)圖片和文字之後,可以把圖片弄很大,文字弄很小(xiǎo)之類自(zì)由控制廣告的展現形式,這樣的自(zì)由是Facebook不願意的,所以Facebook不會(huì)願意提供API,而是需要你集成SDK。
  簡單點來說,SDK對指定功能(néng)的實現是完全隐藏的,隻需要調用接口函數,傳進去特定的值即可實現提供商制定好的功能(néng)。
  API可能(néng)會(huì)包括許多(duō)個(gè)接口函數,這些函數需要按照(zhào)提供的規則進行順序調用,所以在調用不同函數的期間可以插入自(zì)己定制化的代碼。