您在计算机上运行的许多应用程序都有用户界面,通常包含可点击的按钮、可拖动的图标和可输入的文本字段。有些应用程序使用终端作为界面,用户可以通过键入命令而不是点击按钮或拖动图标来进行操作。应用程序编程接口 (API) 也是一种界面,但它是为应用程序而不是用户设计的。
当然,所有计算机最终都是为用户服务的,但 API 使人类可以轻松编写代码,进而控制 API 后面的应用程序。对于人类来说,API 是一种低效且间接的使用应用程序的方式,但对于计算机来说,API 是一种发送信号并获得有意义数据的便捷方式。API 可以通过本地网络或互联网访问,并且可以设计为接受来自任何数量的编程语言和协议的输入。
API 通常用于视频游戏设计和模组制作、扩展复杂应用程序以及从网站抓取数据和与之交互。
通过 API 简化编程
API 的一个优点是它可以对用户隐藏复杂的代码要求。例如,这是一个简单的 C 程序,用于在屏幕上打印“Hello world”
#include <stdio.h>
int main(int argc, char *argv[]) {
int i;
for(i=1;i<argc;i++) {
printf("%s\n",argv[i]);
}
return 0;
}
为产生相同输出而编写的 API 可以大大简化代码。例如,这是一个假想的 API(看起来很像 Lua)
cprint(hello_msg)
当然,创建 API 的代码通常很复杂,正如启发这个简单示例的 Lua 示例 所证明的那样,但最终用户不必处理这些复杂性。最终用户看到的只是一个简化的编程语言,它可以访问非常复杂的计算结果。
通过 API 简化查询
同样,可以通过 API 向最终用户提供特定操作的指令或信息查询。API 使人们能够使用功能,而无需学习复杂的命令,也无需暴露敏感数据。例如,如果您运行支持论坛或聊天服务器,您可能希望分享其他用户的数量(例如,用户越多,获得支持问题答案的可能性就越大),但不分享他们的用户名或活动。
一个真实的例子是开源 Git 托管平台 GitLab 实现的发布 API。GitLab 拥有丰富的 API,可帮助开发人员将其最新的软件构建标记为正式发布。虽然程序员可以在 GitLab Web UI 中创建发布版本,但许多开发人员更喜欢自动化该过程,这样就无需手动点击选项屏幕。GitLab 允许通过 HTTP(使用 POST 方法)发送命令。这是一个例子
$ curl --header 'Content-Type: application/json' \
--header "PRIVATE-TOKEN: example_token" \
--data '{ "name": "Release", "tag_name": "2.4", "description": "Fixed Makefile.am" }' \
--request POST https://gitlab.com/api/v4/projects/trashy%2Ftrashy
GitLab API 还有很多功能,包括获取有关标签和发布的信息、删除发布、更新发布等等。由于 API 使用标准的 HTTP 方法,因此开发人员可以轻松使用并将其集成到他们现有的流程中。
什么是 API 密钥?
在 GitLab 示例中,您可能已经注意到需要一个密钥。API 密钥的功能与完全交互式界面中的用户名和密码相同。由于通过 API 交互的两个实体预计是计算机,因此呈现用户名和密码字段(例如您在登录以查看电子邮件时看到的字段)会过于复杂。相反,人类程序员会获得一个 API 密钥,该密钥可以包含在为与 API 交互而编写的代码中。
获取 API 密钥的方式因您要使用的 API 的编写者而异。例如,GitLab 在其“访问令牌”设置面板中提供 API 密钥,而(闭源)Twitter 服务通过开发者子域名提供 API 密钥。由于 API 密钥通常被认为是开发者工具,因此默认情况下很少向每个用户发放,而是应请求保留给高级用户。
API 密钥与用户名和密码具有相同的优点:它们管理对敏感数据的访问。正如 API 允许一个应用程序根据通过 API 提供的调用选择性地显示信息一样,API 密钥允许根据请求调用是否具有有效的 API 密钥进行例外处理。
SDK 和 API 之间的区别
API 将应用程序的编程功能从用于控制它的工具中抽象出来。软件开发工具包 (SDK) 是应用程序的字面编程功能。
在开源中,API 通常是为了方便或安全而提供的。有时,API 使程序员可以轻松地围绕复杂应用程序构建工具,而无需过多了解应用程序的工作原理。有时,API 会保护重要或敏感数据,同时仍然允许访问其他数据。
在专有应用程序中,SDK 充当代码库中“最开放”的部分,并且通常需要花钱才能合法访问它。它通常是开发人员付费购买的产品部分,以便他们可以使用它进行开发。
从技术上讲,在开源中不需要 SDK。源代码可供任何人直接使用和修改。但是,一些开源项目提供 SDK,以此向开发人员指示哪些功能对于最常见的用例最为重要。例如,如果您想开发一个 Qt 应用程序,您可能需要使用 Qt SDK,即使 Qt 是开源的,因为当人们谈论开发 Qt 应用程序时,他们的意思是他们正在使用 Qt 库来开发自己的应用程序。如果您想开发 Qt 本身,您将不会使用 Qt SDK,因为您实际上是在编写 SDK。
在某些情况下,SDK 和 API 之间的界限可能会模糊,但一般来说,SDK 提供对库的访问,而 API 使用这些库在收到命令后生成结果。
如何创建 API?
API 是一种接口,意味着它的存在是为了促进交互。在计算中,交互通常由请求和响应组成。如果您编写的代码监听通过除直接人为干预之外(或除此之外)的协议发出的指令,那么您可能已经创建了一个 API。
API 可以用任何编程语言编写。许多 API 是用 Java 编写的,并借助了诸如 JBoss 和 3scale 之类的“中间件”,而另一些 API 是用 Python 编写的,使用了 Flask 或 Django 或 Pyramid。还有一些是用 Ruby、Perl、Lua、C、C++、.NET 以及几乎任何您能想到的其他语言编写的。
什么是 RESTful API?
在他的论文中,Roy Fielding 博士描述了一种 API 风格,他称之为“表述性状态转移”(Representational State Transfer),更广为人知的名称是 REST。关于什么才算作 RESTful API,有很多细微之处,但其中最重要的一个概念是无状态性:服务器(API 端根据从客户端收到的提示采取操作)不得存储任何用户数据,并且必须从客户端接收其所需的一切。这意味着 RESTful API 必须具有旨在提供完成交互所需的所有数据的调用。
如果您编写了一个提供用户银行余额的 API,那么您的 API 必须接受用户名和密码(或 API 密钥)、相关的银行账户、检索银行余额所需的命令以及任何选项(例如货币类型和语言)。所有这些信息都必须在每次请求时提供,因为在每次请求之后,服务器都会返回到其默认的无知识状态,就好像它从未收到任何人的请求一样。即使用户正在执行相关任务,例如在将资金从一个账户转移到另一个账户之前获取账户余额,服务器也需要将所有凭据和详细信息作为请求的一部分传输。
RESTful API 有很多好处,其中最重要的是客户端和服务器分离。由于服务器不包含用户数据,并且不依赖于特定类型的接口,因此许多开发人员可以开发独特的客户端。这意味着可以为同一服务器开发手机应用程序和基于终端的应用程序,而无需修改,因为 API 提供了统一的接口。大多数终端命令以相同方式运行并非巧合。即使允许使用存储持久选项的配置文件的命令,仍然提供环境变量或命令行选项,供您指定重要的参数、输入和输出。RESTful API 很像您在其他系统上运行的命令。
利用 API
如果您从未使用过 API,请尝试使用一个简单的 API,然后记下您喜欢它的哪些方面以及它的局限性。如果您是开发人员,请阅读有关 API 设计 的资料,并尝试编写一个 API。与开源本身一样,API 的概念帮助计算变得更加灵活、更易于访问和更高效。熟悉它,并像往常一样,保持开源!