如何理解API,API 是如何工作的-程序员宅基地

技术标签: 学习新知识  维基  api  

阅读本文大概需要 5~6 分钟

大家可能最近经常听到 API 这个概念,那什么是API,它又有什么特点和好处呢?

wiki 百科镇楼

…[APIs are] a set of subroutine definitions, protocols, and tools for building application software. In general terms, it’s a set of clearly defined methods of communication between various software components.

翻译:API 是用于构建应用程序软件的一组子程序定义,协议和工具。一般来说,这是一套明确定义的各种软件组件之间的通信方法。(回来再看(。・∀・)ノ)。

本篇文章中,我会用浅显的比喻来解释API,接口(interface),协议(protocol)这些基本概念。enjoy it ! 

假设你有一个银行


这里写图片描述
你有一个仓库来存钱,一个记账本来记各种业务。一个简单的管理银行的方法是直接将权限给所有人,让客户自己动手完成各种业务。

这种模式下,一个客户想要存钱的话,他需要:

  1. 拿着钱去银行
  2. 打开仓库把钱放进去
  3. 把这笔业务写到记帐本上
  4. 离开银行

显然这存在着问题:

  1. 想开开仓库门需要废很大力气,并不是所有的人都能打开,还有些人不识字不会记账。
  2. 在这个模式下,我们假定所有人都是诚实的,显然这并不成立。(说不定哪一个人存了100块钱记账的时候写了10000块)。

这时你遇到麻烦了。

雇一个柜员


要是我们雇一个体格棒,办事还麻利的人来处理开仓库,记账的问题呢?

小娜登场了。

现在模式为:建一个柜台将仓库和记账本和顾客分开,这样顾客就不需要再去管仓库和记账本了。想存钱的话直接找小娜就行。

这里写图片描述

这种模式下,要是有人想存钱,他们必须:

  1. 拿钱去银行
  2. 告诉小娜我是 MMM 我想要存¥¥¥。
  3. 小娜打开仓库把钱放进去
  4. 小娜把业务(transaction )记录好
  5. 告诉你业务办好了
  6. 顾客离开银行

现在不会发生打不开仓库门或者是记错账的情况了,你觉得很满意。

到此我们引出今天的主角API( Application Programming Interface),它能够帮你实现轻松的和其他软件组件(如服务器,操作系统等)的交互。

在上面举的例子中,我们雇一个收纳员帮顾客解决了开仓门,放钱,记账这一系列繁琐的过程。这大大节省了顾客的时间,同时提高了银行的效率。同理,如果我们将操作的具体实施步骤抽象化,这将会大大降低开发人员的负担(去记忆所有的步骤花费的力气),从而大大提高了效率。

另外的好处是,只要他们遵循了同一个协议,组件可以交换或者是改变。银行不需要知道时哪一个顾客或者说顾客是怎么进来的,顾客也不需要知道银行拿自己的钱去做什么了。只要负责的柜员在这里并做好工作,整个流程将会继续工作。

API 应用范围很广:从操作系统中简单的 fork() 到我们接触的百度地图API,和风天气API,又或者是邢远分享的段子,这些 API 都大大简化了程序员的工作。

银行里有什么


这里写图片描述

你可能已经注意到了银行分成了两个区域:顾客在前台排好队来办理业务,后台完成各种对钱的操作。在中间层,前台和后台发生了交互, 双方都不能越界 ,交互只能发生在中间的区域。

在 API 术语里面,我们管中间的这块区域叫做接口 Interface ;在这里各个部分发生交互。在我们的银行中,前台和后台都同意并且规定使用 Interface 来交换信息。

现在,我们假定 Bob 想要取钱。他到了柜台找到了小娜,小娜知道该怎样去取钱,她取好了之后告诉了 Bob。

这里写图片描述

Bob 这时候又问:“你知道今天的股票行情吗”

小娜:????WTF ?

在这个例子里面,小娜知道怎样取钱和存钱 , 但是她不知道如何去给Bob查查今天的股票行情是怎样的。这个例子引出了另一个概念 协议(Protocol)。

在 API 术语中,协议 是规定了各部分之间如何进行交流的一系列规则的集合。各部分之间想要完成交互必须理解并且遵守同一个协议。

同时,我们注意到了交换时用的是中文。如果Bob 对小娜说「我想撳五百蚊出嚟呀唔該」,小娜不懂广东话,所以没法理解Bob说的是什么,这又引出了另一个概念 格式(Format)

在程序员的世界里,通用的格式包含 XMLJSON

最后,让我们假设银行想要扩展业务到股市,这时候就需要一位特殊的接待员来处理与股票相关的业务了,这时,小冰就登场啦。
这里写图片描述

在 API 术语里面, API 端点 通常是指在同一个接口中提供特定功能子集的服务提供者。在这种情况下,小冰和小娜都是端点。(小冰和小娜是同一个柜台不同功能的提供者)不同的端点可以有不同的协议和不同的格式。

总结起来:接口是不同组件进行交互的地方。协议是一系列规定了他们之间怎样进行交互的规则。格式定义了他们通过什么进行交流(JSON或者是XML),端点可以在同一个接口里面提供不同的功能。

柜员还能干什么?


到现在我们把 API 的基础知识过了一遍,接下来我们再来谈一谈 API 的其他特征。w(゚Д゚)w

现在又有客户来取钱了,他想要取¥10000。
这里写图片描述

首先,我们可以指示小娜在操作前先去确认一下 Bob 是否真的有这么多钱。(API 能确认所有的操作都是合法的。

小娜查到 Bob 账户里只有一百块了,告诉 Bob 余额不足。(在发生错误的时候 API 会根据错误报告机制发出指示,减轻开发人员的负担。

Bob 认为肯定是哪里出错了,他要求银行给他列一张表,给出他所拥有的每个账户上的余额。结果显示一共有 200 个账户。把他们一下子全给列出来不太实际,所以小娜每次给 Bob 看十个账户,看完了之后再来十个。(这叫做分页(pagination),可以节省带宽和服务器资源,因为你不需要一次获取数据集中的所有内容。

如果 Bob 只想要知道他某一个账户中的余额的话,他可以要求小娜只给她看那个的(这称为过滤(filtering),它还有助于节省带宽和资源,并且更易于导航。

在检查完所有账户之后,鲍勃现在知道他的帐户中确实没有10000美元。他知道爱丽丝购买股票并获得了大量资金,于是伪装成爱丽丝并重新进入银行。他告诉莎莉:“我是爱丽丝,我想从我的账户中提取10000美元。” 小娜识破了他的骗局。(API中内置授权和访问控制,以确保只有授权人员才能访问特定数据。

最后,在试图从银行拿到10000美元失败后,他想报复小娜,他进入银行并多次从账户中提取0.01美元。 (我们可以实施速率限制来控制服务器资源的使用,以确保用户不会滥用服务。

API 通常都会被设计具有这些功能,它可以充当防火墙,在保护您的资源免受滥用的同时允许合法请求通过。

再读Wiki


…[APIs are] a set of subroutine definitions, protocols, and tools for building application software. In general terms, it’s a set of clearly defined methods of communication between various software components.

API 是用于构建应用程序软件的一组子程序定义,协议和工具。一般来说,这是一套明确定义的各种软件组件之间的通信方法。

现在是不是头脑里对这个概念清晰多了呢。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/cumtdeyurenjie/article/details/80211896

智能推荐

Jupyter notebook安装与使用_如何将jupyter环境与conda环境进行匹配-程序员宅基地

文章浏览阅读778次。Jupyter notebook安装与使用_如何将jupyter环境与conda环境进行匹配

JavaScript-JS判断一个整数是偶数还是奇数_let num =prompt("请输入一个整登录 if (num %2 === 0){ conso-程序员宅基地

文章浏览阅读3.3k次,点赞2次,收藏4次。let num = prompt("请输入一个整数");if (num % 2 === 0){ console.log("这个数是偶数");} else if (num % 2 === 1){ console.log("这个数是奇数");}_let num =prompt("请输入一个整登录 if (num %2 === 0){ console.log("这个数

Google VR开发-Cardboard VR SDK反畸变实现_distortion_cardboard-程序员宅基地

文章浏览阅读2.9k次。上一篇文章分析了Cardboard SDK的生命周期设计。这里我们看下畸变部分的实现。Cardboard中将畸变这部分封装成了一个Distortion类和DistortionRenderer类。我们看下Distortion这个类: private static final float[] DEFAULT_COEFFICIENTS = { 250.0F, 50000.0_distortion_cardboard

解决Mysql Error:The user specified as a definer (‘mysql.infoschema’@’localhost’) does not exist_the user specified as a definer ('mysgl.infoschema-程序员宅基地

文章浏览阅读1.1w次,点赞3次,收藏4次。SET GLOBAL innodb_fast_shutdown = 1;2.mysql_upgrade -u root -p_the user specified as a definer ('mysgl.infoschema'@'localhost') does not ex

win10退出微软账号_用注册表编辑器退出微软账号-程序员宅基地

文章浏览阅读6.8k次,点赞13次,收藏33次。如何退出微软账号,改成本地账号登录?有人发现,在win10上登录微软账号后,微软账号就自动与本地账号绑定了,不可解除绑定。那除了重置电脑,还有什么方法呢?1、首先进入注册表:win+R 输入:regedit2、依次输入下列两个地址,并删除"邮箱账号这一项"HKEY_CURRENT_USER\Software\Microsoft\IdentityCRL\UserExtendedProperties\邮箱账号HKEY_USERS\.DEFAULT\Software\Microsoft\Ide_用注册表编辑器退出微软账号

Shell命令学习_sh命令-程序员宅基地

文章浏览阅读1k次。What is Shell?Shell 是一个应用程序,它连接了用户和 Linux 内核,让用户能够更加高效、安全、低成本地使用 Linux 内核,这就是 Shell 的本质。Shell 本身并不是内核的一部分,它只是站在内核的基础上编写的一个应用程序,它和 QQ、Firefox 等其它软件没有什么区别。然而 Shell 也有着它的特殊性,就是开机立马启动,并呈现在用户面前;用户通过 Shell 来使用 Linux,不启动 Shell 的话,用户就没办法使用 Linux。Shell 是如何连接用户和内_sh命令

随便推点

VMware中如何实现Linux系统与宿主机文件共享_vmwarelinux与宿主机共享内存-程序员宅基地

文章浏览阅读820次。参考:http://hi.baidu.com/fly_2009hui/blog/item/a62b484f0f4ac63baec3ab73.html使用hgfs实现vmare文件传输一法使用vmware(vmware workstation 5)下shared folders功能实现vmware中host与ghost间文件传输,无需任何网络相关设置,不使用任何网络协议,host和gho_vmwarelinux与宿主机共享内存

go 源码篇(三)CSP GMP Channel_golang 开源csp-程序员宅基地

文章浏览阅读576次。1goroutine原理1.1基本概念并发:一个CPU上能同时执行多项任务,在很短时间内,CPU来回切换任务执行(在某段很短时间内执行程序a,然后又迅速得切换到程序b去执行),有时间上的重叠(宏观上是同时的,微观仍是顺序执 行),这样看起来多个任务像是同时执行,这就是并发。并行当系统有多个CPU时,每个CPU同一时刻都运行任务,互不抢占自己所在的CPU资源,同时进行, 称为并行。进程CPU在切换程序的时候,如果不保存上一个程序的状态(context–上下文),直接切换下一个程 序,就会丢失_golang 开源csp

高一计算机课期中考试总结反思,2017高一数学期中考试反思总结-程序员宅基地

文章浏览阅读76次。引导语:数学新课改的基本理念是:学有价值的数学,反映出学生实践能力和创新意识方面的不足,应引起我们的高度重视,学生的动手能力还有待提高。以下是百分网小编分享给大家的2017高一数学期中考试反思总结,欢迎阅读!过去的一学期里,我班在学校领导的统一组织下,在任课教师的大力支持和配合下,各项工作顺利开展,学习、生活等方面都取得较突出的成绩。现将本学期期中考试前的工作总结如下:一、 加强对学生的思想政治工...

如何使用Stripe和Syncano建立每日确认短信服务-程序员宅基地

文章浏览阅读276次。这篇文章是由赞助Syncano 。 感谢您支持谁使SitePoint可能的赞助商。 Syncano提供了实时应用的基于云的平台。 它存储数据,微服务代码,日程安排用于自动执行代码,用户帐户,网络挂接通过HTTP多以访问这些功能。 他们甚至已经得到的代码片段的开源社区,并支持多种运行环境,包括节点,巨蟒,围棋和Ruby。 从一个开发者角度,Syncano可以更容易获得通过提供大量的,否则你就需..._如何用stripe

MQ和ActiveMQ浅析_activemq和ibmmq的区别-程序员宅基地

文章浏览阅读844次。文章目录什么是JMS MQ消息中间件应用场景**异步通信**缓冲解耦冗余扩展性可恢复性顺序保证**过载保护****数据流处理**常用消息队列(ActiveMQ、RabbitMQ、RocketMQ、Kafka)比较JMS中的一些角色**Broker**providerConsumerp2ppub/subPTP 和 PUB/SUB 简单对QueueTopicConnectionFactoryConnectionDestinationSessionJMS的消息格式JMS消息由以下三部分组成的:TextMessag_activemq和ibmmq的区别

造梦师手记:SDXL更新最勤奋的梦幻模型_dreamshaper模型和sdxl模型的区别-程序员宅基地

文章浏览阅读238次。天道酬勤,这个模型也成为C站下载量最大的SDXL模型之一(当然,距离dreamshaperXL还有不小的差距)。但是,随着拥护者的增多,越来越多的建议得到反馈,就有望成为SDXL时代的顶尖少数几个大模型之一。可以预见的未来,至少在SDXL时代,由于SDXL本身的强大数据集,模型也会出现“马太效应”,会向极少数模型聚集。当然了,如果你能习惯comfyUI,也是非常不错的,这个UI虽然对很多新手界面不太友好,但对系统资源占用较少。短短不到一个月的时间,涌现出大量的模型和LoRA,丰富了我们的创作素材。_dreamshaper模型和sdxl模型的区别

推荐文章

热门文章

相关标签