通過(guò)代碼解釋什么是API,什么是SDK?

這個(gè)問(wèn)題說(shuō)來(lái)慚愧,讀書(shū)時(shí)找實(shí)習(xí)面的第一家公司,問(wèn)的第一個(gè)問(wèn)題就是這個(gè)。

當(dāng)時(shí)我沒(méi)能說(shuō)清楚,回去之后就上百度查。結(jié)果查了很久還是看不懂,然后就把這個(gè)問(wèn)題擱置了。

誰(shuí)知道畢業(yè)正式工作后,又再一次地面對(duì)了這個(gè)問(wèn)題......(事實(shí)告訴我們,欠的知識(shí)債總是要還的)

現(xiàn)在回過(guò)頭想,我能明白自己為啥想不通這個(gè)問(wèn)題:

  1. 沒(méi)用過(guò) SDK
  2. 思維只停留在前后端 API 接口交互

所以想要弄清楚這個(gè)問(wèn)題,看別人寫(xiě)的概念解釋文章可能幫助不大,還是得自己親手設(shè)計(jì)一下 API,使用或簡(jiǎn)單封裝一個(gè) SDK。

下面,我嘗試設(shè)計(jì)一個(gè)小故事,直接通過(guò)代碼講清楚這個(gè)事兒。

對(duì)外提供云你好服務(wù)

假設(shè)我是一個(gè)軟件服務(wù)提供商,我設(shè)計(jì)了一個(gè)打招呼的服務(wù),給他起了個(gè)名字叫:云你好。

用戶只要調(diào)用我的 API 接口,就能使用我的服務(wù),我會(huì)向他打一個(gè)招呼。

首先我起一個(gè)后端服務(wù),這里選擇用 python,主要是用 python 比較快,代碼少,解釋這個(gè)問(wèn)題和語(yǔ)言無(wú)關(guān)哈。(先看代碼,再解釋)

# 云你好服務(wù)源碼
from flask import Flask
from flask import request

app = Flask(__name__)

# 云你好服務(wù) API 接口
@app.get("/api/hello")
def hello():
    # 看用戶是否傳遞了參數(shù),參數(shù)為打招呼的目標(biāo)
    name = request.args.get("name", "")
    # 如果傳了參數(shù)就向目標(biāo)對(duì)象打招呼,輸出 Hello XXX,否則輸出 Hello World
    return f"Hello {name}" if name else "Hello World"

# 啟動(dòng)云你好服務(wù)
if __name__ == '__main__':
    app.run()

從上面代碼可以看出,我定義好了你好云的 API 接口:

@app.get("/api/hello")
def hello():
    ......

當(dāng)我的服務(wù)跑起來(lái)后,我就會(huì)告訴用戶我的 API 調(diào)用方式:

請(qǐng)求地址:GET http://127.0.0.1:5000/api/hello

可選請(qǐng)求參數(shù):name - 打招呼的對(duì)象名兒

當(dāng)然更規(guī)范的做法是提供一份 API 文檔。

沒(méi)有 SDK 如何使用云你好

接下來(lái)我們切換一下身份,假設(shè)我現(xiàn)在是一名云你好的用戶。

在我登陸上云你好的官網(wǎng)后,只看到了云你好定義的 API 調(diào)用規(guī)則。

也就是說(shuō),如果我想使用云你好服務(wù),不管我是寫(xiě) python,寫(xiě) java,或是寫(xiě) golang,都得寫(xiě)發(fā)送 http 請(qǐng)求的代碼,調(diào)用云你好的 API 使用打招呼服務(wù)。

比如在 python 中我們可以這樣寫(xiě):

# 我是云你好服務(wù)的一名客戶,我通過(guò)發(fā)送 http get 請(qǐng)求使用云你好

import requests

# API 地址
url = "http://127.0.0.1:5000/api/hello"
# 發(fā)送 GET 請(qǐng)求
response = requests.get(url=url, params={"name": "阿菌"})
# 打印響應(yīng)結(jié)果
print(response.text)

最后得到結(jié)果:Hello 阿菌

更好地服務(wù)我的客戶

接下來(lái)我們切換一下身份,假設(shè)我變回了云你好的服務(wù)提供商。

經(jīng)過(guò)一些簡(jiǎn)單的調(diào)研,我聽(tīng)說(shuō)有非常多的 python / java / golang 工作者喜歡使用我們的云你好服務(wù)。

為了讓他們更方便地使用云你好服務(wù),我決定向他們提供云你好服務(wù) python sdk / java sdk / golang sdk,進(jìn)一步降低他們使用云你好服務(wù)的難度(忽悠他們更多的服務(wù)費(fèi))

下面我以 python sdk 作為示例,在 sdk 中,我會(huì)封裝好使用云你好服務(wù)的邏輯,僅對(duì)用戶提供一個(gè) hello 方法,這樣只要用戶安裝好云你好 sdk,就能直接調(diào)用 hello 方法使用云你好服務(wù)了。

# 云你好 python sdk
import requests


class HelloSDK:
    # 云你好服務(wù)地址
    service_url = "http://127.0.0.1:5000/api/hello"

    @classmethod
    def hello(cls, name):
        response = requests.get(url=cls.service_url, params={"name": name})
        return response.text

寫(xiě)好 sdk 后,我們會(huì)在官方網(wǎng)站上更新道:

大家好,歡迎使用云你好 python sdk,您可以通過(guò)以下方式使用 sdk:

  1. 安裝云你好 sdk:pip install hello-sdk
  2. 使用你好云 sdk:
from hello_sdk import HelloSDK

HelloSDK.hello("阿菌")

使用 SDK 訪問(wèn)你好云

然后我們?cè)俅吻袚Q身份,假設(shè)我是你好云服務(wù)的用戶,你好云發(fā)布 SDK 了,我非常高興,于是我的代碼就簡(jiǎn)化成這樣了:

# 我是云你好服務(wù)的一名客戶,我通過(guò)你好云的 hello-sdk 使用你好云服務(wù)

from hello_sdk import HelloSDK

HelloSDK.hello("阿菌")

得到的結(jié)果仍然是:Hello 阿菌

總結(jié)

希望上面的代碼能幫助大家理解 API 和 SDK,當(dāng)然它只是一個(gè)極簡(jiǎn)的 Demo,不能代表 API 和 SDK 這兩個(gè)概念的全部東西。

IT 行業(yè)中有很多概念,他們背后往往對(duì)應(yīng)的是一類行為,如果僅從技術(shù)名詞的角度理解是非常痛苦的,所以極力推薦動(dòng)手實(shí)踐學(xué)習(xí)。

API 的全稱是:Application Program Interface(應(yīng)用程序接口)

SDK 的全稱是:Software Development Kit(軟件開(kāi)發(fā)工具包)

如果讓我總結(jié) API 和 SDK 的區(qū)別,我覺(jué)得 API 可以理解成一種標(biāo)準(zhǔn)吧,我們按照服務(wù)提供商定義的 API 標(biāo)準(zhǔn)去調(diào)用他們的服務(wù),就能得到相應(yīng)的結(jié)果。

而 SDK 可以理解為對(duì) API 背后服務(wù)的一種封裝,它更貼近用戶,能大幅降低用戶使用服務(wù)的開(kāi)發(fā)成本。

最后,如果大伙還想進(jìn)一步學(xué)習(xí)的話,推薦去看一下云廠商的 API 和 SDK 定義,甚至分別動(dòng)手體驗(yàn)一下,絕對(duì)瞬間秒懂。

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

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

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