这个问题说来惭愧,读书时找实习面的第一家公司,问的第一个问题就是这个。

当时我没能说清楚,回去之后就上百度查。结果查了很久还是看不懂,然后就把这个问题搁置了。

谁知道毕业正式工作后,又再一次地面对了这个问题......(事实告诉我们,欠的知识债总是要还的)

现在回过头想,我能明白自己为啥想不通这个问题:

  1. 没用过 SDK
  2. 思维只停留在前后端 API 接口交互

所以想要弄清楚这个问题,看别人写的概念解释文章可能帮助不大,还是得自己亲手设计一下 API,使用或简单封装一个 SDK。

下面,我尝试设计一个小故事,直接通过代码讲清楚这个事儿。

对外提供云你好服务

假设我是一个软件服务提供商,我设计了一个打招呼的服务,给他起了个名字叫:云你好。

用户只要调用我的 API 接口,就能使用我的服务,我会向他打一个招呼。

首先我起一个后端服务,这里选择用 python,主要是用 python 比较快,代码少,解释这个问题和语言无关哈。(先看代码,再解释)

# 云你好服务源码
from flask import Flask
from flask import request app = Flask(__name__) # 云你好服务 API 接口
@app.get("/api/hello")
def hello():
# 看用户是否传递了参数,参数为打招呼的目标
name = request.args.get("name", "")
# 如果传了参数就向目标对象打招呼,输出 Hello XXX,否则输出 Hello World
return f"Hello {name}" if name else "Hello World" # 启动云你好服务
if __name__ == '__main__':
app.run()

从上面代码可以看出,我定义好了你好云的 API 接口:

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

当我的服务跑起来后,我就会告诉用户我的 API 调用方式:

请求地址:GET http://127.0.0.1:5000/api/hello

可选请求参数:name - 打招呼的对象名儿

当然更规范的做法是提供一份 API 文档。

没有 SDK 如何使用云你好

接下来我们切换一下身份,假设我现在是一名云你好的用户。

在我登陆上云你好的官网后,只看到了云你好定义的 API 调用规则。

也就是说,如果我想使用云你好服务,不管我是写 python,写 java,或是写 golang,都得写发送 http 请求的代码,调用云你好的 API 使用打招呼服务。

比如在 python 中我们可以这样写:

# 我是云你好服务的一名客户,我通过发送 http get 请求使用云你好

import requests

# API 地址
url = "http://127.0.0.1:5000/api/hello"
# 发送 GET 请求
response = requests.get(url=url, params={"name": "阿菌"})
# 打印响应结果
print(response.text)

最后得到结果:Hello 阿菌

更好地服务我的客户

接下来我们切换一下身份,假设我变回了云你好的服务提供商。

经过一些简单的调研,我听说有非常多的 python / java / golang 工作者喜欢使用我们的云你好服务。

为了让他们更方便地使用云你好服务,我决定向他们提供云你好服务 python sdk / java sdk / golang sdk,进一步降低他们使用云你好服务的难度(忽悠他们更多的服务费)

下面我以 python sdk 作为示例,在 sdk 中,我会封装好使用云你好服务的逻辑,仅对用户提供一个 hello 方法,这样只要用户安装好云你好 sdk,就能直接调用 hello 方法使用云你好服务了。

# 云你好 python sdk
import requests class HelloSDK:
# 云你好服务地址
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

写好 sdk 后,我们会在官方网站上更新道:

大家好,欢迎使用云你好 python sdk,您可以通过以下方式使用 sdk:

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

HelloSDK.hello("阿菌")

使用 SDK 访问你好云

然后我们再次切换身份,假设我是你好云服务的用户,你好云发布 SDK 了,我非常高兴,于是我的代码就简化成这样了:

# 我是云你好服务的一名客户,我通过你好云的 hello-sdk 使用你好云服务

from hello_sdk import HelloSDK

HelloSDK.hello("阿菌")

得到的结果仍然是:Hello 阿菌

总结

希望上面的代码能帮助大家理解 API 和 SDK,当然它只是一个极简的 Demo,不能代表 API 和 SDK 这两个概念的全部东西。

IT 行业中有很多概念,他们背后往往对应的是一类行为,如果仅从技术名词的角度理解是非常痛苦的,所以极力推荐动手实践学习。

API 的全称是:Application Program Interface(应用程序接口)

SDK 的全称是:Software Development Kit(软件开发工具包)

如果让我总结 API 和 SDK 的区别,我觉得 API 可以理解成一种标准吧,我们按照服务提供商定义的 API 标准去调用他们的服务,就能得到相应的结果。

而 SDK 可以理解为对 API 背后服务的一种封装,它更贴近用户,能大幅降低用户使用服务的开发成本。

最后,如果同学们还想进一步学习的话,推荐去看一下云厂商的 API 和 SDK 定义,甚至分别动手体验一下,绝对瞬间秒懂。

通过代码解释什么是API,什么是SDK?的更多相关文章

  1. 试试使用 eolinker 扫描 GitLab 代码注释自动生成 API 文档?

    前言: 一般写完代码之后,还要将各类参数注解写入API文档,方便后续进行对接和测试,这个过程通常都很麻烦,如果有工具可以读取代码注释直接生成API文档的话,那会十分方便. 此前一直都是在使用eolin ...

  2. Deep Learning入门视频(下)之关于《感受神经网络》两节中的代码解释

    代码1如下: #深度学习入门课程之感受神经网络(上)代码解释: import numpy as np import matplotlib.pyplot as plt #matplotlib是一个库,p ...

  3. MVC代码中如何调用api接口

    关于代码解释,为了方便读者浏览时更好理解代码的含义,我把注释都写在代码里面了.因为一开始我只考虑到功能上的实现并没有考虑代码的优化所以代码我就全写在一个页面了.至于那些生成扑克牌类.计算类等代码优化方 ...

  4. [ARM] Cortex-M Startup.s启动文件相关代码解释

    1. 定义一个段名为CSTACK, 这里: NOROOT表示如何定义的段没有被关联,那么同意会被优化掉,如果不想被优化掉就使用ROOT. 后面的括号里数字表示如下: (1):这个段是2的1次方即2字节 ...

  5. word2vec代码解释

    以前看的国外的一篇文章,用代码解释word2vec训练过程,觉得写的不错,转过来了 原文链接 http://nbviewer.jupyter.org/github/dolaameng/tutorial ...

  6. API、Win32 SDK、Win32项目、MFC、Windows窗体应用程序的区别

    [原]API.Win32 SDK.Win32项目.MFC.Windows窗体应用程序的区别 首先来看一下每一个术语的定义: API:Application Programming Interface. ...

  7. TensorFlow的序列模型代码解释(RNN、LSTM)---笔记(16)

    1.学习单步的RNN:RNNCell.BasicRNNCell.BasicLSTMCell.LSTMCell.GRUCell (1)RNNCell 如果要学习TensorFlow中的RNN,第一站应该 ...

  8. vs2010代码注释自动生成api文档

    最近做了一些接口,提供其他人调用,要写个api文档,可是我想代码注释已经写了说明,能不能直接把代码注释生成api?于是找到以下方法 环境:vs2010 先下载安装Sandcastle 和Sandcas ...

  9. javascript代码解释执行过程

    javascript是由浏览器解释执行的脚本语言,不同于java c,需要先编译后运行,javascript 由浏览器js解释器进行解释执行,总的过程分为两大块,预编译期和执行期 下面的几个demo解 ...

随机推荐

  1. @RequestMapping 注解?

    该注解是用来映射一个URL到一个类或一个特定的方处理法上.

  2. Kafka 消费者是否可以消费指定分区消息?

    Kafa consumer消费消息时,向broker发出fetch请求去消费特定分区的消息,consumer指定消息在日志中的偏移量(offset),就可以消费从这个位置开始的消息,customer拥 ...

  3. IIS在ASP.NET Core下的两种部署模式

    KestrelServer最大的优势体现在它的跨平台的能力,如果ASP.NET CORE应用只需要部署在Windows环境下,IIS也是不错的选择.ASP.NET CORE应用针对IIS具有两种部署模 ...

  4. C语言之常量(知识点4)

    一.常量(概念) ①用标识符代表常量 ②一般用大写字母表示 二.定义格式 #define 符号常量 常量 三.案例 #define PI 40; #define PRICE 30; 四.注意 ①其值在 ...

  5. Linux下切换python2和python3

    为什么需要有两个版本的Python Python2和Python3不兼容是每个接触过Python的开发者都知道的事,虽说Python3是未来,但是仍然有很多项目采用Python2开发.Linux的许多 ...

  6. PCB各层的含义

    阻焊层:solder mask,是指板子上要上绿油的部分:因为它是负片输出,所以实际上有solder mask的部分实际效果并不上绿油,而是镀锡,呈银白色! 助焊层:paste mask,是机器贴片时 ...

  7. Java中if else条件判断语句的执行顺序

    学习目标: 掌握 if else 条件判断的使用 学习内容: 1.if语法 if(boolean表达式) { 语句体; } if后面的{}表示一个整体-代码块,称之为语句体,当boolean表达式为t ...

  8. iframe引入微信公众号文章

    微信在文章页面设置了响应头""frame-ancestors 'self'"阻止了外部页面将其嵌套的行为,文章的图片也设置了防盗链的功能,这就导致了直接在iframe中引 ...

  9. Java-GUI编程之事件处理

    事件处理 前面介绍了如何放置各种组件,从而得到了丰富多彩的图形界面,但这些界面还不能响应用户的任何操作.比如单击前面所有窗口右上角的"X"按钮,但窗口依然不会关闭.因为在 AWT ...

  10. 百度离线人脸识别sdk的使用

    1.1下载sdk运行 百度离线人脸识别sdk的使用 1.2配置环境 添加至项目,可以拖动复制或者以类库形式添加face-resource此文件夹 放到根目录上一层 激活文件与所有dll引用放到根目录嫌 ...