应用程序编程接口向开发人员隐藏复杂性,将系统扩展到合作伙伴,组织代码并使组件可重用 API代表应用程序编程接口,这个概念适用于从命令行工具到企业Java代码再到RubyonRailsWeb应用程序的任何地方。API是一种以编程方式与单独的软件组件或资源进行交互的方式。 除非你从头开始编写每一行代码,否则你将与外部软件组件交互,每个组件都有自己的API。即使你完全从头开始编写一些东西,设计良好的软件应用程序也将具有内部API来帮助组织代码并使组件更可重用。并且有许多公共API允许你利用通过网络在其他地方开发的功能。什么是API? API被定义为与软件组件可能交互的规范。这究竟是什么意思?好吧,想象一下汽车是一个软件组件。它的API将包括关于它可以做什么的信息加速、刹车、打开收音机等。它还包括关于如何让它做这些事情的信息。例如,要加速,您将脚放在油门踏板上并推动。 API不必解释当你踩下油门时发动机内部会发生什么。这就是为什么,如果你学会了驾驶内燃机汽车,你就可以驾驭电动汽车,而无需学习一套全新的技能。API定义中的内容和方式信息结合在一起,该定义是抽象的并且与汽车本身分离。 要记住的一件事是,某些API的名称通常用于指代交互规范和与你交互的实际软件组件。例如,短语TwitterAPI不仅指以编程方式与Twitter交互的一组规则,而且通常被理解为表示您与之交互的事物,如我们正在对我们从中获得的推文进行分析TwitterAPI。API作为抽象层 说到软件,API几乎无处不在。API与计算机科学中最基本的概念之一密切相关:抽象。抽象只是组织系统复杂性的一种方式,以便可以以简单的方式处理复杂的操作。把这种抽象想象成那些淘宝DashButtons,电池供电的按钮电路板,你可以用来从淘宝订购订书钉。这是它们的样子: 你从淘宝订购了一个DashButton,并使用智能手机上的应用程序将其与你的WiFi网络、你的淘宝帐户和产品(例如你最喜欢的纸巾品牌)相关联。然后,每当你想订购更多纸巾时,只需按下按钮即可。DashButton连接到Internet并发送消息以在你的帐户上下订单。几天后,纸巾就会送到你家门口。 像API一样,DashButton是一个非常简单的界面,在幕后隐藏了各种复杂性。你订购的产品的ID必须从某个数据库中检索。你的送货地址必须从你的帐户中提取。必须确定最近存放你的纸巾的运营中心,然后通知你从可用库存中移除商品并打包。最后,包裹必须与其他包裹一起通过飞机、卡车和货车的某种组合,以确保所有包裹都能有效地到达目的地。 现在想象一下,作为客户,你必须协调所有这些事情。你永远不会订购纸巾,因为它太复杂和耗时,而且你还有更好的事情要做。幸运的是,整个磨难都离你而去。有一条长长的、相互关联的计算机系统和人工流程链让这些纸巾出现在您家门口,但你只需按下一个按钮即可。 这就是API对程序员的意义。它们采用了大量的复杂性,并定义了一组相对简单的交互,您可以利用这些交互,而不是自己全部完成。在任何软件项目中,你可能会直接使用数十个甚至数百个API,并且这些API中的每一个都依赖于其他API,依此类推。公共API和API集成 API是计算机编程中的一个长期概念,多年来它们一直是开发人员工具集的一部分。传统上,API用于连接在同一台机器上运行的代码组件。随着无处不在的网络的兴起,越来越多的公共API(有时称为开放API)变得可用。公共API面向外部并可通过Internet访问,允许你编写与其他供应商在线代码交互的代码;此过程称为API集成。 这些类型的代码混搭允许用户在他们自己的系统上混合和匹配来自不同供应商的功能。例如,如果你使用营销自动化软件Marketo,你可以将你的数据与SalesforceCRM功能同步。 在这种情况下,开放或公共不应被解释为免费。你仍然需要成为Marketo和Salesforce客户才能使用此功能。但是这些API的可用性使集成过程比其他方式简单得多。(InfoWorld有很多您应该了解的公共API列表。)Web服务和API 你可能会想起00年代早期的网络服务一词,并认为开放API的想法听起来非常相似。事实上,Web服务是一种特定类型的开放API,它满足一组相当严格的规范,包括用Web服务描述语言(WSDL)(一种XML变体)指定的规范。 Web服务旨在用作面向服务架构(SOA)的一部分。正如NordicAPIs博客所解释的那样,这给Web服务带来了坏名声,因为SOA从未完全发挥其潜力。用于服务到服务通信的技术的进步特别是更轻量、更灵活的REST也让Web服务在公共API的世界中有些落后。RESTAPI Web服务最初设计为使用SOAP(简单对象访问协议)进行通信,这是一种通过HTTP发送XML文档的消息传递协议。然而,如今,大多数基于Web的API都使用REST(具象状态传输)作为架构风格。 REST由RoyFielding在2000年的博士论文中正式引入。它是一组架构组件、设计原则和交互,用于构建涉及任何类型媒体(文本、视频等)的分布式系统。从本质上讲,REST是一种构建系统的风格,它允许在网络上灵活地通信和显示信息,同时提供轻松构建通用组件所需的结构。 在RESTAPI中,资源几乎可以是任何东西,但示例包括用户、推文列表和推文搜索的当前结果。这些资源中的每一个都可以在资源标识符处进行寻址,在基于Web的RESTAPI的情况下,该标识符通常是一个URL。当应用程序使用标识符请求资源时,API以应用程序可以使用的格式(例如JPEG图像、HTML页面或JSON)将该资源的当前表示交付给应用程序。 REST的一大区别在于它涉及向发出请求的应用程序发送数据。虽然这提供了极大的灵活性,允许应用程序对数据做任何它想做的事情,但它是以效率为代价的。与在数据所在的位置进行处理然后发送结果相比,通过Web发送数据进行处理要慢得多。 当然,高效方法的问题在于托管数据的系统需要提前知道应用程序想要用它做什么。因此,为了构建具有通用可用性和灵活性的API,REST是必经之路。API示例 有许多公共API可供您交互,其中许多来自行业巨头。通过API以编程方式访问某些平台公司代码的能力使它们成为一个平台,本质上。一些突出的API示例包括:GoogleAPIs,允许您将代码连接到从地图到翻译的所有Google服务。API对Google来说非常重要,以至于他们收购了领先的API管理平台Apigee。FacebookAPIs,允许你以编程方式访问Facebook的社交图谱和营销工具。(在CambridgeAnalytica和其他丑闻的影响下,该公司一直在限制你可以通过这些API访问的用户数据。) 为了真正了解API的工作原理,让我们深入研究两个:JavaAPI,Java开发人员使用它与Java平台交互,以及TwitterAPI,一个公共API,你将使用它与社交媒体交互网络服务。JavaAPI JavaAPI是一个开箱即用的软件组件库,可供安装了Java开发工具包的任何人使用。这些组件执行常见任务并通常提高生产力,因为程序员不必每次都从头开始。软件中使用的基本组件之一是称为列表的东西,正如您所料,它跟踪项目列表。JavaAPI定义了您可以对List执行的操作:添加项目、对列表进行排序、确定某个项目是否在列表中等。它还指定了如何执行这些操作。为了对列表进行排序,你需要指定列表的排序方式:按字母顺序、数字降序、从最亮到最暗的颜色等。 推特API TwitterAPI是一个基于Web的JSONAPI,它允许开发人员以编程方式与Twitter数据交互。与Java开发工具包中包含的JavaAPI不同,TwitterAPI是基于Web的API。必须通过Internet向Twitter托管的服务发出请求来访问它。 使用基于Web的API(例如Twitter的),你的应用程序会发送HTTP请求,就像Web浏览器一样。但是为了人类理解,响应不是作为网页传递的,而是以应用程序可以轻松解析的格式返回。为此存在各种格式,Twitter使用一种流行且易于使用的格式,称为JSON。 Twitter的基本元素之一是推文。TwitterAPI告诉你可以用推文做什么:搜索推文、创建推文、收藏推文。它还告诉您如何执行这些操作。要搜索推文,您需要指定搜索条件:要查找的术语或主题标签、地理位置、语言等。 API设计 API设计师制定API的内容和方式的过程。与可以创建的任何其他事物一样,API设计中的思考和程度各不相同,从而导致API质量的不同程度。精心设计的API具有一致的行为、考虑其上下文并牢记用户的需求。 API中的一致行为极大地影响了它的学习速度以及程序员在使用它时出错的可能性。通常,执行相似操作的API的行为应该相似,而不管它们的技术差异如何。举个API不一致的例子,让我们看看Java中国List添加项的两种方式: 即使将项目添加到列表的两种方法做同样的事情,它们的返回类型(boolean和void)是不同的。使用此API的开发人员现在必须跟踪哪个方法返回哪种类型,这使得API更难学习并且其使用更容易出错。这也意味着使用这些方法的代码变得不那么灵活,因为如果你想改变你添加元素的方式,它必须改变。 考虑上下文是另一种形式的一致性,尽管它与API外部的因素有关。一个很好的非软件示例是道路规则(右侧交通或左侧交通)如何影响不同国家地区的汽车设计。汽车设计师在将驾驶员座椅放置在汽车的右侧或左侧时会考虑到环境因素。 在API设计中,考虑上下文通常意味着您遵循普遍接受的最佳实践,并从你的用户可能熟悉的其他API中汲取灵感。假设你正在构建一个库,该库为Java应用程序提供了一种新的List,可能是专门为处理非常大的列表而设计的。该List的API可能应该包含一个add方法,其行为方式与JavaListadd方法的工作方式相同。这样,用户就可以轻松采用您的库,因为他们已经知道如何使用它。 了解您的用户并牢记他们的需求在API设计中至关重要。如果您了解他们的痛点并帮助他们避免这种痛苦,那么你的API将拥有快乐的用户。出于同样的原因,你可能会选择打破良好API设计的其他规则。如果你正在编写WebAPI,那么今天的事实上的标准是使用JSON作为交换格式。但是,如果你的API将服务于检索大量数据的科学用户,那么JSON将过于冗长和繁琐,无法很好地为他们服务。因此,你可能会选择使用像GRIB这样的二进制格式,尽管从一般意义上来说这是一个非常不常见的选择。 API是软件设计的重要组成部分,它们存在于软件堆栈的每个级别。它们提供了一种定义和管理抽象的方法,告诉我们我们可以用软件组件做什么以及我们如何做。设计良好的API支持高效、流畅和轻松地采用和使用,而设计不当的API往往会在每次使用时引起头痛。总结 API是用于构建应用程序软件的一组子程序定义,协议和工具。一般来说,这是一套明确定义的各种软件组件之间的通信方法。 如果本文对你有所帮助,欢迎点赞转发,也欢迎大家说说自己在学习的时候自己的一些心得,方便大家一起学习共同成长!java架构大仙阅读更多技术干货文章。