API和SDK的区别

199

我想向一个非开发人员解释API和SDK之间的区别。我需要解释为什么商业指纹软件供应商很可能不会提供SDK,尽管他们肯定可能使用了SDK。

设备供应商和软件供应商都可以和应该暴露一个定义良好的API。这个API允许其他软件程序与供应商自己的软件组件或硬件设备(编写)互操作。

如果有更多想要清晰解释的想法,我非常感激建议。我想强调目标是向一个不知道开发人员术语的非程序员解释概念

具体而言,在指纹传感器与用于注册/验证的软件的背景下,这就是我尝试解释的方式:

如果我是一个指纹设备/传感器制造商并且不从事编写软件的业务,则可以更好地营销我的产品的方法是:

  1. 确保我的设备驱动程序可以安装在各种操作系统上
  2. 为软件开发人员定义和提供一个API来编写与我的设备“对话”或使用我的设备的程序(例如,用于注册、验证等)
  3. 开发并提供一个SDK(比API更进一步)使软件开发人员更轻松、更快速地编写与我的设备配合使用的程序。SDK可能提供辅助代码库、参考应用程序、文档等。
9个回答

234

易如反掌:

  • API是一个接口。它就像电话系统或您家中的电气布线规范一样。只要知道如何接口,任何东西*都可以使用它。您甚至可以购买现成的软件来使用特定的API,就像您可以购买电话设备或插入您家中交流电线路的设备一样。
  • SDK是实现工具。它就像一个工具包,允许**您构建自定义内容以连接到电话系统或电气布线。

*任何东西都可以使用API。某些API具有安全保护措施,需要许可证密钥、身份验证等,这可能会禁止在特定情况下完全使用API,但这仅因为特定的身份验证/授权步骤失败。只要提供正确的凭据(如果需要),任何软件都可以使用API。

**从技术上讲,如果API有良好的文档,您不需要SDK来构建自己的软件以使用API。但是,拥有SDK通常会使该过程更加容易。


2
我对解释这个问题还有一些其他的想法,比如用iPhone示例(专有代码但定义良好的API)、电话插孔或USB端口示例来解释什么是软件接口,以更容易理解的硬件类比方式。 - Sliceoftime
19
继续这个好的解释,即API可以是一个http/REST API,而SDK可以是在HttpClient之上的库,使与REST Web服务的交互更快速、更容易。 - frandevel
4
简单来说,API是一个接口。而SDK则是在接口之上的抽象层。 - tvanc
2
SDK并不一定是接口的抽象层;SDK是接口的实现。 (如果有另一个抽象层,则问题在于为什么它没有作为接口本身的一部分指定) - Jason S
我同意这个定义,但同时想知道为什么iOS和Android在蓝牙库(如iOS Core Bluetooth API、Android Bluetooth APIs)中使用API这个术语? - tamberg

63
API 就像是儿童玩具拼图游戏的积木,可以用不同形状的积木搭建自己想象的东西。
SDK 则是一个完整的工作室,其中提供了所有的开发工具,而不仅仅是预先制定好的积木。在工作室中,你有实际的工具,并且不受积木的限制,因此可以制作自己的积木,或者可以开始不使用任何积木来创建东西。
没有SDK或API的编程就像是没有工作室自己从头开始制作一切 - 甚至需要制作自己的工具。

你说SDK没有预先形成的构建块,但是JAVA SDK带有数据结构,例如ArrayList或HashMap...? - Koray Tugay
1
是的,你可以把它看作是构建块,但另一方面,Java将其提供为工具而不是构建块。 - Abdul Rehman
1
当我尝试阅读和理解Facebook文档时,我遇到了这个问题:https://developers.facebook.com/docs/javascript 有一件事让我感到困惑,那就是Facebook称其为JavaScript SDK,而在我看来它更像是一个API。因为它并没有提供任何实际的工具,只是一个开发人员可以使用的库,所以它应该被称为API而不是SDK,你觉得呢? - shenkwen
SDK的解释在我看来并不完全正确。与其说“不限于块,或者可以从头开始创建一些没有块的东西”,不如说SDK为您提供了更好的API块组合方式。SDK是在API的基础上构建的。 - Don Cheadle

28

假设公司C提供产品P,并且P在某种程度上涉及软件。那么C可以向软件开发人员提供一组驱动P软件系统的库。

这个库就是一个SDK。它是P系统的一部分,是供软件开发人员使用的工具包,用于修改、配置、修复、改进等P软件的部分。

如果C想将P的功能提供给其他公司/系统,则使用一个API

这是与P交互的外部系统的接口。

如果从实现角度来看,它们似乎非常相似。尤其是现在互联网已经变成了一个巨大的分布式操作系统。

然而,从目的上来看,它们实际上是非常不同的。

你使用SDK来构建东西,使用API来使用或消费东西。


23
你只需要将答案编辑到最后一行,跳过所有的冗长废话即可。 - mhenry1384
如果C提供了一组驱动P软件的库,那么这些库就构成了API,而不是SDK(除非它是一个绝对最小的仅包含API的SDK)。SDK将包括这些API以及开发人员需要的所有好东西,除了原始API之外,因此称为“工具包”。所以你关于构建与使用/消耗(+/控制/交互)的观点是正确的,但区分在其他方面却很混乱。 - Josh Sutterfield

14
"应用程序编程接口(API)是一组例程/数据结构/类,它规定了与目标平台/软件的交互方式,例如OS X、Android、项目管理应用程序、虚拟化软件等。而软件开发工具包(SDK)是对API的封装,使得开发者的工作更加轻松。例如,Android SDK可以方便开发者与整个Android平台进行交互,而平台本身则是由通过API通信的复合软件组件构建而成的。此外,有时SDK也会专门为某种编程语言的开发提供便利。例如,Selenium web driver(使用Java构建)提供了驱动任何浏览器的原生API,而capybara则可视为一个SDK,它方便Ruby开发者使用Selenium web driver。然而,Selenium web driver本身也是一个SDK,因为它将与各种本地浏览器驱动程序的交互组合到一个软件包中。"

只是觉得引用一些例子会很好。 - user3137634

9

我不确定这两个术语是否有官方定义。我理解API是一组文档化的可编程库和支持源代码,例如头文件或IDL文件。SDK通常包含API,但通常还会添加编译器、工具和示例。


1
从技术上讲,API需要被指定但不必公开记录,它们可以是秘密的。 - Jason S

8
API是关于如何做某事的规范,就像“铁路轨道间距为四英尺,金属杆宽1英寸”。有了API,您现在可以构建一个适合这些铁路轨道的火车,以便到达任何地方。API只是构建代码的信息,它本身并不执行任何操作。
SDK是一些实际工具的包,已经考虑了规范。 “这里有一辆火车,一些煤和一个维修工人。用它从一个地方到另一个地方。”使用SDK时,您不必担心具体细节。 SDK是实际的代码,它可以单独使用来执行某些操作,但当然,火车不会自发启动,您仍然需要一个列车长来控制火车。
SDK还有自己的API。例如,“如果要给火车供电,请加煤”,“拉动蓝色杠杆以移动火车”,“如果火车开始出问题,请联系维修工人”等。

5

API = 可用词汇及其含义(以及将它们组合所需的语法)的字典

SDK = 一个文字处理系统...为两岁的婴儿...从想法中就开始写作

虽然你可以去学校几年成为语言方面的专家,但使用SDK将帮助你在短时间内编写完整的有意义的句子(原谅这个例子中,作为一个婴儿,你还没有学习任何其他语言至少要学会使用SDK的事实)。


2

你可以这样理解:如果你想在家里安装家庭影院系统,使用 API 就像获得所有的电线、螺丝、零件等。它有无限的可能性(只受到你获得的零件的限制),但有时会让人感到不知所措。而 SDK 则像是获得一个工具包。你仍然需要将其组装起来,但这更像是获得了预先切割好的零件以及一本宜家书架的说明书,而不是一盒螺丝钉。


0

源代码

API(应用程序编程接口)是一组规则,指定两个软件程序应如何相互交互。它为不同的软件系统提供了一种通信和交换数据和信息的方式。

SDK(软件开发工具包)是一组工具和库,为开发人员提供了构建特定软件或平台应用程序的能力。它通常包括API、文档和示例代码,并且还可能包括用于测试和调试的工具和库。

总的来说,API是不同软件系统相互通信的一种方式,而SDK是帮助开发人员为特定平台构建应用程序的一组工具和库。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接