应用编程接口(API)
Web API 是一种通过网络提供的应用程序编程接口,允许不同的软件系统通过互联网进行通信和数据交换。Web API 通常使用 HTTP 或 HTTPS 协议,可以被各种客户端(如 Web 浏览器、移动应用、桌面应用等)调用,用于访问和操作服务器上的资源或服务。
Web API 的特点
- 基于 HTTP/HTTPS 协议:Web API 使用 HTTP 或 HTTPS 作为通信协议,便于通过互联网进行数据传输。
- 支持多种数据格式:Web API 通常支持多种数据格式,最常见的是 JSON 和 XML,这些格式易于解析和处理。
- 无状态通信:每个请求都是独立的,服务器不需要记住先前的请求状态。每个请求包含所有必要的信息。
- 跨平台:由于使用标准的 HTTP/HTTPS 协议和通用的数据格式,Web API 可以在不同的操作系统和编程语言之间进行交互。
Web API 的类型
目前主流的 Web API 可以分为以下几类:
- RESTful API:遵循 REST 架构风格的 Web API。
- SOAP API:遵循 SOAP 协议的 Web API。
- GraphQL API:遵循 GraphQL 协议的 Web API。
- RPC API:遵循 RPC 协议的 Web API。
RPC API
RPC(Remote Procedure Call)是一种通过网络调用远程服务的协议。
RPC API 的特点:
- 基于 RPC 协议:使用 RPC 协议作为通信协议。
- 无状态通信:服务器不保存客户端的状态,所有状态信息都由客户端保存并在每次请求时传递。
- 支持多种数据格式:支持多种数据格式,如 JSON、XML、二进制等。
示例:
调用远程服务的示例:
POST /rpc HTTP/1.1
Host: api.example.com
Content-Type: application/json
{
"method": "getUser",
"params": [123],
"id": 1
}
SOAP API
SOAP(Simple Object Access Protocol)是一种基于 XML 的协议,用于在网络上交换结构化信息。
SOAP API 的特点:
- 基于 XML:使用 XML 作为消息格式。
- 严格的标准:包括安全性、事务处理等。
- 更复杂:相比 REST,SOAP 的实现和解析更复杂。
示例:
SOAP 请求示例(简化版):
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:example">
<soapenv:Header/>
<soapenv:Body>
<urn:GetUser>
<urn:UserId>123</urn:UserId>
</urn:GetUser>
</soapenv:Body>
</soapenv:Envelope>
GraphQL API
GraphQL(Graph Query Language)是一种用于 API 的查询语言。
GraphQL API 的特点:
- 基于 GraphQL 协议:使用 GraphQL 协议作为通信协议。
- 强类型系统:GraphQL 具有强类型系统,可以方便地定义数据模型。
- 更灵活:GraphQL 允许客户端指定所需的数据,可以更灵活地获取数据。
示例:
GraphQL 请求示例(简化版):
query {
user(id: 123) {
id
name
email
}
}
RESTful API
REST(Representational State Transfer)是一种架构风格,强调资源的表述和状态转换。RESTful API 是遵循 REST 架构风格的 Web API。
RESTful API 的特点:
- 资源导向:每个资源都通过 URL 唯一标识。
- 使用标准的 HTTP 方法:如 GET、POST、PUT、DELETE 等。
- 无状态通信:服务器不保存客户端的状态,所有状态信息都由客户端保存并在每次请求时传递。
- 支持多种数据格式:最常用的是 JSON。
由于 RESTful API 是目前最流行的 Web API 类型,因此下列再对 RESTful API 遵循的 REST 原则进行简要介绍。
RESTful API 遵循的 REST 原则:
-
协议
RESTful API 使用 HTTP 协议作为通信协议,如 GET、POST、PUT、DELETE。
-
域名
RESTful API 应该尽量使用专用域名,如 api.eaveluo.com。
如果确定 API 很简单,不会有进一步扩展,可以考虑放在主域名下,如 eaveluo.com/api。
-
版本
RESTful API 应该有版本号,如 api.eaveluo.com/v1。
-
路径
RESTfulRESTful API 使用名词表示资源,使用动词表示操作,如 /users、/users/:id。
-
HTTP 动词
RESTful API 使用 HTTP 动词来表示操作,如 GET、POST、PUT、DELETE。
- GET:获取资源。
- POST:创建资源。
- PUT:更新资源。
- DELETE:删除资源。
-
过滤
如果记录数量很多,服务器不可能都将它们返回给用户。API 应该提供参数,过滤返回结果。
下面是一些常见的参数:
- ?limit=10:指定返回记录的数量
- ?page=8$limit=10:指定第几页,以及每页的记录数。
- ?sortby=name&order=asc:指定返回结果按照哪个属性排序,以及排序顺序。
- ?name=Eave Luo:指定筛选条件
-
状态码
服务器向用户返回的状态码和提示信息,常见的有以下一些:
- 200 OK:请求成功。
- 201 Created:资源创建成功。
- 204 No Content:请求成功,但没有返回任何内容。
- 400 Bad Request:请求语法错误。
- 401 Unauthorized:请求未授权。
- 403 Forbidden:服务器拒绝请求。
- 404 Not Found:请求的资源不存在。
- 500 Internal Server Error:服务器内部错误。
-
错误处理
如果状态码是 4xx,就应该向用户返回出错信息。一般来说,返回的信息中将 error 作为键名,出错信息作为键值即可。
示例:
{
"error": "User not found"
} -
返回结果
服务器向用户返回的结果,应该符合 API 文档中定义的格式。
示例:
[
{
"id": 1,
"name": "Eave Luo",
"email": "hi@eaveluo.com"
},
{
"id": 2,
"name": "Admin",
"email": "admin@eaveluo.com"
}
]
示例:
获取所有用户:
GET /users
Host: api.eaveluo.com
创建新用户:
POST /users
Host: api.eaveluo.com
Content-Type: application/json
{
"name": "Eave Luo",
"email": "hi@eaveluo.com"
}
Web API 的优点
- 跨平台:可以在不同的平台和编程语言之间进行通信。
- 灵活性:可以用于各种应用场景,如 Web 应用、移动应用、桌面应用等。
- 可扩展性:可以根据需求增加新的端点和功能。
- 易于集成:使用标准的 HTTP 协议和通用的数据格式,便于与其他系统集成。
Web API 的应用场景
- Web 服务:通过 Web API 提供后端服务,如用户管理、订单处理等。
- 移动应用:移动应用可以通过 Web API 与后端服务器通信,获取和提交数据。
- 第三方集成:允许第三方开发者访问和使用你的系统功能,如支付网关、社交媒体 API 等。
- 物联网:物联网设备可以通过 Web API 与服务器进行数据交换和远程控制。
构建一个简单的 RESTful Web API 示例(使用 Node.js)
下面是一个使用 Node.js 和 Express 框架构建的简单 RESTful Web API 示例:
安装 Express
npm install express
创建一个简单的 RESTful API
const express = require('express');
const app = express();
const port = 3000;
app.use(express.json());
let users = [
{ id: 1, name: 'Eave Luo', email: 'hi@eaveluo.com' },
{ id: 2, name: 'Admin', email: 'admin@eaveluo.com' },
];
// 获取所有用户
app.get('/users', (req, res) => {
res.json(users);
});
// 获取指定ID的用户
app.get('/users/:id', (req, res) => {
const user = users.find((u) => u.id === parseInt(req.params.id));
if (!user) return res.status(404).send('User not found');
res.json(user);
});
// 创建新用户
app.post('/users', (req, res) => {
const user = {
id: users.length + 1,
name: req.body.name,
email: req.body.email,
};
users.push(user);
res.status(201).json(user);
});
// 更新指定ID的用户
app.put('/users/:id', (req, res) => {
const user = users.find((u) => u.id === parseInt(req.params.id));
if (!user) return res.status(404).send('User not found');
user.name = req.body.name;
user.email = req.body.email;
res.json(user);
});
// 删除指定ID的用户
app.delete('/users/:id', (req, res) => {
const userIndex = users.findIndex((u) => u.id === parseInt(req.params.id));
if (userIndex === -1) return res.status(404).send('User not found');
users.splice(userIndex, 1);
res.status(204).send();
});
app.listen(port, () => {
console.log(`Server running at http://localhost:${port}/`);
});
通过这个简单的示例,展示了如何使用 Node.js 和 Express 框架创建一个基本的 RESTful Web API,包括基本的 CRUD(创建、读取、更新、删除)操作。
接口调试工具
有很多工具可以用来调试 Web API,如 Postman、ApiFox 等。下面介绍几个常用的接口调试工具。
- Postman:Postman 是一个开源的 API 调试工具,可以用来测试 Web API,官方网站:https://www.postman.com/。
- ApiFox:API 设计、开发、测试一体化协作平台,Apifox = Postman + Swagger + Mock + JMeter,官方网站:https://apifox.com/。