API入门:了解API

3 min read

应用程序编程接口 (API) 定义了允许不同软件组件相互通信的标准和协议,使应用程序能够从独立系统中请求数据和执行操作。

API无处不在,几乎为您的所有设备和软件交互提供支持。例如,手机上的应用程序使用API从服务器获取数据,然后依赖 iOS和Android提供的独立API将数据显示在屏幕上、通过推送通知发送给您,或与联系人共享。

由于API有多种形式,因此很难理解它们如何相互关联。有哪些类型的 API?什么情况才算API?如何创建自己的API?在这份综合指南中,您将找到这些问题的答案。

什么是API?

应用程序编程接口这个术语看起来可能稍显晦涩,但它指的是一个特定概念。API最简单的形式是一个工具,允许开发人员编写与应用程序配合使用的代码。它规定了一个促进互操作性的接口或两个或多个系统必须遵守的规则、程序、期望和标准。

我们通过一个例子来探讨这个概念:想象一个公开注册新用户API的身份平台。外部应用程序可以使用这个API按需创建用户,但要使其正常工作,数据需要以平台期望的格式传输。

API明确了这些要求:它可能规定客户端应用程序必须向example.com/users发出HTTP POST请求;需要包含姓名、电子邮件和密码数据字段;并且将以JSON格式响应回复,其中包含新用户的ID。有了这些信息,开发人员就可以使用API成功注册新用户。

本质上,API是开发人员可以调用的平台代码与解释使用方法的文档组合。

为什么API很重要?

API允许数据在系统之间流动。这使得该软件可以在其他应用程序的基础上构建,从而创建出更强大的解决方案。

API对自动化也至关重要。通过将不同API的功能组合到一个应用程序中,您可以在发出操作和发生事件时在系统之间传输数据。开发人员只需编写几行代码,就可以实现需要繁琐的手动编程才能实现的复杂流程。。

例如,网页抓取是一项复杂的任务。要让网络爬虫有效工作,开发人员需要创建复杂的逻辑来控制网络浏览器实例、设置地理位置代理并绕过验证码。选择API后,只需少量网络请求即可访问所有这些功能。然后,您可以使用其他API来对抓取的数据进行操作和分析,并将结果发送给聊天平台中的团队成员。

此外,API也是商业资产。促进与其他工具的轻松集成可以使您的平台对客户更具吸引力。外部开发人员可以自由构建超越各个独立部分之和的解决方案。

API对于今天的超连接流程至关重要。许多被认为理所当然的技术都是由复杂的API网络提供支持的。例如,在线购物通常涉及由多个独立供应商托管的付款收集、运输请求和电子邮件发送API。

API类型

每个API提供不同功能来匹配所属服务。例如,就API功能来说,身份管理解决方案与搜索引擎抓取提供商截然不同。

然而,看似无关的API在技术特性上往往十分相似。大多数流行API使用少数不同的标准,这些标准代表软件行业在集成系统方面找到的有效方法。

我们来看一些不同类型的API:

#REST

表述性状态转移 (REST) 最初由Roy Fielding于 2000 年提出,现在被大多数网络服务所使用。

REST将系统数据表示为映射到HTTP URL的无状态资源。使用HTTP方法(GET 、 POST 、 PUT和DELETE、)检索资源并对其执行操作。

例如,对example.com/users/100发起的GET请求应该返回关于ID为100的用户的以下信息:


{
    "Id": 100,
    "Name": "Example User",
    "Email": "[email protected]"
}

如果您随后向同一URL发出DELETE请求,则服务会销毁该对象。

REST之所以受欢迎,是因为它基于HTTP构建、易于实施,并且有效模拟了许多实际应用程序处理其数据的方式。与很多系统的交互往往是动词(DELETE)和名词(user)的组合,而这种架构可以直接用REST来表达。

#SOAP

与REST不同,简单对象访问协议 (SOAP) 是一种数据共享的正式规范。所有SOAP交换都使用XML数据格式,而 REST API 可能提供JSON、XML、CSV或特定平台的替代方案。一个简单的SOAP API 调用可能产生如下响应:

xml
<?xml version="1.0" ?>
<soap:Envelope
   	 xmlns:soap="https://www.w3.org/2003/05/soap-envelope/"
   	 soap:encodingStyle="https://www.w3.org/2003/05/soap-encoding">
   	 <soap:Body>
   		 <m:GetUserResponse>
   			 <m:Id>100</m:Id>
   			 <m:Name>Example User</m:Name>
   			 <m:Email>[email protected]</m:Email>
   		 </m:GetUserResponse>
   	 </soap:Body>
</soap:Envelope>

使用XML并包含特定协议的属性使得SOAP比典型的REST API更加冗长。然而,SOAP的标准化优势使它受到许多大型企业和商业系统青睐。API 中可用的操作由XML模式明确定义。这些模式描述了每个请求和响应的结构和数据类型,降低了客户端与服务器不匹配的风险。

#GraphQL

GraphQL是一种相对年轻的构建可操作API的技术。脸书在2012年开发,并于2015年公开发布。

GraphQL旨在解决REST和SOAP API面临的若干挑战。通过提供一种表达性语言让客户端可以使用该语言从 API 中提取数据,简化复杂的查询。GraphQL使您可以仅检索所需的特定数据字段,而不是整个对象。这可以避免传输多余数据造成的浪费。

以下是一个简单的GraphQL查询,用于获取用户电子邮件地址:

{
    user {
   	 Email
    }
}

该查询请求将产生以下响应:

json
{
    "user": {
   	 "Email": "[email protected]"
    }
}

由于更多功能且更适合当今高度连接的应用程序,GraphQL越来越受欢迎,其中小部分数据由多个不同组件独立获取。然而,实现GraphQL可能相对复杂,最好使用特定语言的编程工具来处理

#RPC

远程过程调用 (RPC) 是API的一种简单形式。该技术是指以本地可用的方式调用远程函数。基本网络请求会导致API服务器执行任务并提供结果。客户端不会接触到网络通信的详细信息。

RPC API看起来类似于函数式编程接口。您调用的URL中包含动词和名词,例如example.com/deleteUser?User=100 。与REST不同的是,在 REST 中,您将动词应用于特定名词 (DELETE example.com/users/100)。 RPC 更直接映射到代码,而 REST 则试图对数据结构进行建模。

RPC在客户端和服务器都易于使用。RPC是一组接受各种请求参数并发送数据作为响应的URL。然而,这些API没有标准化,开发人员往往难以探索。然而,一旦您知道服务资源的名称,就可以预测大多数REST API的端点,而用于RPC的URL对每个平台都是唯一的。

gRPC等现代项目正在对RPC进行改进。gRPC是一个适应多种编程语言的框架,可快速定义RPC API服务,这些服务使用协议缓冲区(谷歌将数据序列化结构化的高性能方法)与客户端进行通信。

系统API

REST、SOAP、GraphQL和RPC API被用于系统之间的网络通信。其他类型的API可用于不同集成,例如系统接口,会允许应用程序访问设备功能。

这些API由操作系统(Windows、Android和iOS)提供。它们通过编程框架和SDK公开,开发人员可以从这些API代码中调用。无需程序员编写底层代码,通过系统API即可方便地访问通知、启动器图标、媒体播放和设备传感器访问等功能。

编程语言API

同样,编程语言和依赖项也有自己的API。语言标准库中包含的模块代表了一个API。项目中的第三方安装包也是API,您编写的组件通过定义的接口连接在一起。

API是系统内部工作方式(随时可能变化)与集成者所依赖的稳定外部接口之间的区别。您在代码库中标记为公开的方法和函数会创建其他代码可以使用的API。

同步API和异步API

API可以是同步,也可以是异步。同步API会立刻返回请求操作的结果,而异步API可能会在数据交换完成后继续执行。

对于数据采集 API,请求采集当前的数据是一项同步任务,所以它总是立刻返回目前为止检索到的数据。请求采集抓取新数据可能是异步的,因为该过程可能需要很长时间才能完成。 对API来说,在通知客户端已安排采集后,立刻终止通信会更有效。

深入了解:API的工作原理

每种常见的 API 类型都有自己的语法。例如REST使用对象和动词;而GraphQL提供了一种多功能解决方案,以客户端为中心而不是以服务器为中心。我们来更详细地了解这两个选项:

# REST

REST 使用HTTP方法动词对资源执行操作。最常见的方法有GET 、 POST 、 PUT和DELETE:

  • GET /users/100返回用户100的ID 。
  • POST /users创建一个新用户。
  • PUT /users/100通过 ID 更新用户。
  • DELETE /users/100根据 ID 删除用户。

这说明了基本的REST语法。URL提供了您正在交互的对象ID及其实例的复数名词。客户端使用的HTTP方法确定将要执行的操作。

当某个操作需要附加数据才能完成时,它会作为HTTP请求的负载。例如,当使用 POST /users 创建用户时,请求主体会包含要分配的用户名和密码。

API对每个请求都使用描述其结果的HTTP状态代码进行响应。例如,对GET /users/100的404 Not Found响应表示用户ID 100不存在,而DELETE /users/100的202 Accepted表示该用户已成功删除。

#GraphQL

相比之下,GraphQL是一种不同的API方法,被宣传为“API的查询语言”](https://graphql.org),暗示它所支持的更高级功能。REST经常会因为包含不需要的对象属性而浪费带宽,而GraphQL可以让您仅请求所需的确切数据。

使用GraphQL的API被编写为服务,定义了客户端可以调用的端点。服务是用于实体的类型化模式。模式中的每个字段都分配有特定的数据类型:

type Team {
    id: ID
    name: String
}

type User {
    id: ID
    name: String
    email: String
    team: Team
}

您可以使用查询(query)从模式中获取数据:

{
    user(id: 100) {
   	 email,
   	 team {
   		 name
   	 }
    }
}

此示例查询可能返回以下数据:

{
    "email": "[email protected]",
    "team": "Example Team"
}

查询中的字段由解析器(resolvers)支持。执行查询时,解析器负责为每个字段生成一个值。在前面的示例中, 团队/team解析器将从分配给请求的用户团队中提取名称/ name属性,而不是返回整个对象。

GraphQL还提供了一种统一的方法,使用变异来更新数据。变异类似于查询,但变异会更改服务器状态。为服务中的每个字段定义一个函数即可实现变异。该函数负责将新值保存到字段中。

通过将GraphQL 客户端库添加到项目中,即可创建GraphQL API。库里的工具让您能够从现有ORM模型和其他代码中方便地生成 GraphQL 模式。

如何集成API

API集成描述在软件系统中采用API的过程。尽管API提供了现成的函数,但您仍然需要编写一些自定义代码才能在项目中进行使用。

典型的API集成涉及以下步骤:

1.评估可用选项:首先,您需要评估能解决您用例的不同API,并确定最适合您产品的API。这包括查看文档质量,是否有活跃的社区使用该API,以及维护人员对支持请求、安全问题和错误报告的响应速度。

2.注册并请求API密钥:某些 API 是公开的,不需要身份验证,但大多数API会在超过基本使用阈值后要求您注册并获取API密钥。API密钥应被视为敏感值并安全存储,不要将它们硬编码到项目代码中。该密钥可对您进行身份验证,并识别您的应用程序以进行速率限制和使用情况跟踪。

3.寻找适合您编程语言的API客户端库:您可以通过使用编程语言的HTTP库发出直接网络请求来集成API。然而,许多API供应商还提供围绕API的客户端库和SDK,以提供更方便的编程语言。如果有可用的客户端库,选择使用将进一步简化实施并保护您免受底层API 任何重大更改的影响。

4.编写代码:确定您的库后,就可以编写与API交互的代码了。您需要使用获得的API密钥配置正在使用的库。您的代码还可能必须设置服务所需的配置参数,例如数据中心区域和首选响应格式。

5.测试API集成:最后,测试您的集成,确保按照预期工作。您的测试应包括检查错误处理例程,例如API不可用时会发生什么情况。这能帮助您确保服务离线时应用程序仍有弹性。

集成API时,也需要考虑安全影响。尽管第三方API可以简化关键的开发任务,但在将用户数据发送到外部服务时仍应谨慎行事。该平台能够达到与自己平台相同的安全标准?如果您可以轻松复制API功能,那么在应用程序中构建自己的可行实现会更安全。

现实生活中的API示例

准备好使用 API 了吗?要快速体验网络API,您可以使用计算机上已有的HTTP工具,包括curl和wget 。如果您更喜欢图形界面,Postman是一个不错的选择。

使用Faker获取虚假数据

Faker API项目是一个流行的API集合,可以返回各种主题的随机生成数据。
产品开发过程中,在实际的后端系统可用之前,Faker API常被用来生成并填充界面。

Faker API使用REST原则,URL末尾的名词定义了要生成的数据类型:

$ curl https://fakerapi.it/api/v1/books?_quantity=1
{
	"status": "OK",
	"code": 200,
	"total": 1,
	"data": [
    	{
        	"id": 1,
        	"title": "Duck and a pair of.",
        	"author": "Jessyca McKenzie",
        	"genre": "Sit",
        	"description": "ALL RETURNED FROM HIM TO YOU,\"' said Alice. 'I wonder how many miles I've fallen by this time, as it can be,' said the Cat. '--so long as I used--and I don't take this child away with me,' thought.",
        	"isbn": "9796054956226",
        	"image": "http://placeimg.com/480/640/any",
        	"published": "2010-09-14",
        	"publisher": "Quod Enim"
    	}
	]
}

使用亮数据抓取搜索引擎列表数据

亮数据提供了一套全面的SERP API代理 API。它是一个您需要注册的商业平台:

要开始使用,您可以注册免费试用账户,然后按照文档说明将SERP API 添加到您的帐户。接下来,您需要在API的高级选项中启用异步模式

激活API后,您可以提交POST请求来获取搜索引擎结果:

$ curl -i "https://brightdata.com/api/serp/req?customer={CUSTOMER_ID}&zone={CUSTOMER_ZONE}" \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer {API_TOKEN}" \
    -d '{"country":"us","query":{"q":"apis"}}'
...
x-response-id: s3wt2t...

在您的账户设置中生成API令牌,然后将其替换为命令而不是“{API_TOKEN}”:

在 SERP API测试环境中找到其他占位符{CUSTOMER_ID}和{CUSTOMER_ZONE}的相应值。

此查询示例使用API预约美国谷歌搜索“apis” 。复制命令输出中显示的x-response-id响应标头的值。您可以使用此值在SERP 结果生成后进行检索。稍等一会,然后发出以下请求:

$ curl "https://brightdata.com/api/serp/get_result?customer={CUSTOMER_ID}&zone={CUSTOMER_ZONE}&output=json&response_id={RESPONSE_ID}"

用之前复制的值替换RESPONSE_ID。搜索生成的数据将显示在控制台中。

这些端点是RPC API的示例。如果API符合REST原则,则URL将如下所示:

POST /api/serp/request and GET /api/serp/results/{RESPONSE_ID}.

总结

API是明确定义的接口,能可靠地连接不同软件组件。然而,因为有多种不同的形式、变体和用例,API的构成可能会令人困惑。

总的来说,API 是一种机制:代码可以并且应该使用API来访问由其他代码实现的功能。API由远程系统的开发人员支持,并记录使用说明。这在服务和使用API的客户端应用程序之间创建了协议。如果客户端以预期格式发送数据,则保证会收到具有可预测结构的响应。

API简化了系统内专用功能的实现。您可以让行业专家为您完成繁重的工作,并将其平台集成到您的代码中。尝试使用亮数据的SERP API和代理 API套件来执行您的网页抓取任务。