
理解API代码:高效REST API集成的综合指南
API(Application Programming Interface)是现代软件的构建块之一,它允许不同的应用程序之间进行通信和协作,进而使得开发者能够创建出更为动态、灵活且具有扩展性的软件。随着互联网技术的不断发展,各种API规范也随之涌现,其中最常见的API风格包括:RESTful API、GraphQL API、RPC API和SOAP API。
本文将介绍这几种主流的API风格,并就它们的优缺点进行对比分析,以及哪种规范更加适合不同的应用程序场景。了解API规范的差异性和各自的优点,能够帮助开发者更好地理解如何构建高性能、高可靠、易扩展、易维护的服务。
• 官网:https://restfulapi.net/
RESTful API是最常见的API风格之一,REST 指的是 Representational State Transfer,即表述性状态转移。
RESTful API的核心是:使数据作为资源可用。
下面是RESTful的一些关键的设计原则和约束
RESTful API 遵循 HTTP 协议,使用 HTTP 方法(GET、POST、PUT、DELETE)对资源进行操作,这些方法对应着资源的不同操作类型,使得客户端和服务器之间可以以统一的方式进行通信和交互,实现了应用程序之间的数据传递和交互。开发者可以根据实际需求设计出符合规范的 RESTful API 接口。
GET /users/1
POST /users
{
"name": "windeal",
"age": 25,
"email": "xxxx@163.com"
}
更新资源(PUT)
更新一个资源。例如,将 ID 为 1 的用户信息更新为:
PUT /users/1
{
"name": "Jane",
"age": 30,
"email": "jane@example.com"
}
删除资源(DELETE)
删除一个资源。例如,删除 ID 为 1 的用户:
DELETE /users/1
GraphQL API官网: https://graphql.org/
GraphQL API的基本概念是使用GraphQL语言来描述API的查询能力。客户端通过GraphQL语言来描述所需的数据,而无需知道底层的数据结构和存储方式。然后,服务器会根据客户端的请求生成响应,并将数据发送回客户端。
GraphQL API遵循以下设计原则:
示例一:查询博客文章列表
query {
posts {
id
title
author {
id
name
}
}
}
在这个示例中,我们查询了博客文章列表,每篇文章都有一个 ID、标题和作者。作者包括 ID 和名字。这个查询对于一个显示所有博客文章的列表的应用程序非常有用。
示例二: 创建新的博客文章
mutation {
createPost(input: {
title: "My new blog post"
content: "This is the content of my new blog post."
authorId: "123"
}) {
id
title
content
author {
id
name
}
}
}
在这个示例中,我们创建了一个新的博客文章。我们提供了文章的标题、内容和作者 ID。查询返回了新创建的文章的 ID、标题、内容和作者。这个查询对于创建新的博客文章的应用程序非常有用。
RPC API官网 https://grpc.io/
RPC(Remote Procedure Call)API 是一种远程调用协议,它允许客户端在不了解服务端实现细节的情况下,调用服务端上的函数或方法。RPC API 的主要特点是它可以跨越网络,实现不同计算机之间的通信和数据交换。
gRPC 是一个高性能、开源的 RPC 框架,它可以在多种环境中运行,包括云端、数据中心和本地计算机。gRPC 使用 HTTP/2 协议进行通信,并利用 Protocol Buffers 作为接口定义语言和消息交换格式,以实现高效的数据传输和低延迟。
gRPC 的特点包括:
一个用户信息查询的示例:
定义接口:
syntax = "proto3";
service UserService {
rpc GetUserInfo (UserRequest) returns (UserResponse);
}
message UserRequest {
int32 user_id = 1;
}
message UserResponse {
string username = 1;
int32 age = 2;
bool gender = 3;
}
基于这个proto文件,可以生成客户端和服务端的桩代码。
在服务端,需要定义转代码中的handler接口。
在客户端,可以通过桩代码像调用本地函数一样调用接口。
SOAP(Simple Object Access Protocol,简单对象访问协议)是一种基于 XML 的通信协议,它定义了用于 Web 上的应用程序之间通信的标准格式。 SOAP API 是基于 SOAP 协议的一种 API 设计方式,用于实现应用程序之间的数据交互和通信。
在 SOAP API 中,通信双方都需要遵循一定的协议格式,以实现数据的传递和解析。SOAP API 由以下几个关键概念组成:
SOAP API 的特点包括:
以下是一个基于 Amazon 的 Product Advertising API,使用 SOAP API 调用获取某个关键词的商品信息的示例。
SOAP 请求消息示例:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:api="http://soap.amazon.com">
<soapenv:Header/>
<soapenv:Body>
<api:ItemSearch>
<api:AssociateTag>Your_Associate_Tag</api:AssociateTag>
<api:Author>Stephen King</api:Author>
<api:Keywords>Carrie</api:Keywords>
<api:SearchIndex>Books</api:SearchIndex>
<api:ResponseGroup>Medium</api:ResponseGroup>
<api:Availability>Available</api:Availability>
<api:Sort>Title</api:Sort>
<api:Power><api:BrowseNode>17</api:BrowseNode>
</api:ItemSearch>
</soapenv:Body>
</soapenv:Envelope>
SOAP 相应消息示例
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:api="http://soap.amazon.com">
<soapenv:Header/>
<soapenv:Body>
<api:ItemSearchResponse>
<api:Items>
<api:Request>
<api:ValidRequest>true</api:ValidRequest>
</api:Request>
<api:Item>
<api:ASIN>B0000ZD9PC</api:ASIN>
<api:DetailPageURL>http://www.amazon.com/Carrie-Stephen-King/dp/B0000ZD9PC</api:DetailPageURL>
<api:ItemAttributes>
<api:Title>Carrie: A Novel</api:Title>
<api:Author>Stephen King</api:Author>
<api:ListPrice>
<api:Amount>699</api:Amount>
<api:CurrencyCode>USD</api:CurrencyCode>
</api:ListPrice>
</api:ItemAttributes>
</api:Item>
</api:Items>
</api:ItemSearchResponse>
</soapenv:Body>
</soapenv:Envelope>
在上面的示例中,我们使用 ItemSearch 方法,向 Amazon 发送一个查询关键词“Carrie”的 SOAP 请求,并包含关键词、搜索目录、响应类型、排序等参数。服务器返回查找结果,并在 SOAP 响应消息中返回 Amazon 的商品信息。开发者可以按照 SOAP 响应消息中的结构,解析并处理 Amazon 的商品信息。
下表列出了四种主流的API风格在使用场景、数据格式和接口性能等方面的比较:
API风格 | 使用场景 | 数据格式 | 接口性能 |
---|---|---|---|
SOAP API | 企业级应用、大规模数据请求与查询、跨平台应用 | XML | 低 |
RESTful API | 互联网Web应用、处理实时数据、与前端结合 | JSON/XML | 高 |
GraphQL | 需要控制返回的数据字段、精细定制查询 | 自定义查询语言 | 高 |
gRPC | 对内应用程序、处理大量数据传输请求 | protobufs | 高 |
本文章转载微信公众号@Tech Lead 进阶