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

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

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

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

  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. springmvc对参数接收的两个注解@RequestParam和@RequestBody

    @RequestParam 作用:将请求参数绑定到控制器的方法参数上,主要用于接收几班类型参数 语法:@RequestParam(value="参数名",required=&quo ...

  2. mybatis-02-mapper生成器插件使用

    sb_mybatis <?xml version="1.0" encoding="UTF-8"?> <project xmlns=" ...

  3. Unsafe Rust 能做什么

    在不安全的 Rust 中唯一不同的是,你可以: 对原始指针进行解引用 调用"不安全"的函数(包括 C 函数.编译器的内建指令和原始分配器. 实现"不安全"的特性 ...

  4. jq与js的写法,示例回到顶部div滚动显示隐藏

    jq:var top_icon = $('.top_icon')[0]; id写法$('#id'),类写法$('.class'),标签写法$('div') 如:join=document.getEle ...

  5. 破界!Omi生态omi-mp发布,用小程序开发生成Web

    omi-mp 是什么 Omi 框架是微信支付线研发部和 AlloyTeam 开源的通用 Web 组件化框架,基于 Web Components,用来开发 PC.手机浏览器或者微信.手Q webview ...

  6. 重磅:前端 MVVM 与 FRP 的升阶实践 —— ReRest 可视化编程

    ReRest (Reactive Resource State Transfer) 是前端开发领域新兴的方法论体系,它继承了 MVVM 与 FRP 编程理念,在技术上有不少创新.本文从专利稿修改而来, ...

  7. ubantu系统之 在桌面添加应用快捷方式

    1. 首先在终端使用命令:sudo nautilus 这个命令会让你用root权限打开文件管理器,输入这个命令然后输入密码确认之后会弹出一个目录窗口;2. 然后我们就要找到目录:/usr/share/ ...

  8. EMS恢复禁用邮箱

    使用PowerShell命令恢复禁用邮箱 键入以下命令: [PS] C:\Windows\system32>Get-MailboxDatabase | Get-MailboxStatistics ...

  9. uni-app中实现左侧导航栏效果

    HTML: 1 <view class="list"> 2 <!-- 一级 --> 3 <scroll-view class="list-l ...

  10. FreeSql的各种工程demo上新啦

    FreeSql的各种工程demo GitHub | Gitee console,winforms nf461,vb,wpf,webapi,workerSevice,signalIR xamarinFo ...