什么是 API
客户端、服务器,以及你早已在不知不觉中发出的请求。
API 是一个程序向另一个程序请求东西的方式。这个名字是 application programming interface(应用程序编程接口)的缩写,但它几乎什么都没告诉你。在实践中,以及在本教程的其余部分,API 指的是一台用数据而不是网页来响应请求的服务器。
手机上的天气应用并不存储天气预报。你打开它时,它会向某处的服务器发送请求,拿回几 KB 的温度和风速数据,再把它们画到屏幕上。服务器那一端就是 API,应用是它的客户端之一。
你的第一个请求
把这个地址粘贴到浏览器的地址栏,然后按回车:
https://api.testingapis.com/api/Products/1你会得到类似这样的内容:
{
"id": 1,
"title": "Wireless Noise-Cancelling Headphones",
"price": 249.99,
"description": "Over-ear headphones with 30hr battery life and active noise cancellation.",
"category": "electronics",
"image": "https://picsum.photos/seed/prod1/400/400",
"rating": { "rate": 4.3, "count": 127 },
"inStock": true,
"createdAt": "2025-06-12T10:30:00Z"
}你的浏览器向服务器发送了一个请求。服务器查找了编号为 1 的商品,并返回了它的描述。这样一次交换,一个请求加一个响应,就是所有 API 交互的本质。本教程的其余部分讲的就是这次交换的细节,以及如何检查服务器是否把它们处理对了。
你也可以直接从本页发送请求。下面的“发送”按钮会做和浏览器刚才一样的事,并在响应体上方显示响应的状态。你会在各节课中经常看到这些按钮。
/api/Products/1客户端和服务器
发送请求的程序是客户端,作出响应的程序是服务器。客户端可以是浏览器、手机应用、另一台服务器、命令行工具,或者你写的一个测试。服务器分不清它们,也不需要分清。它读取请求,完成工作,然后回复。
这对测试很重要。因为服务器以同样的方式对待每个客户端,所以你可以不借助平时和它通信的应用来测试它。要看商品价格是否正确,你不需要在购物应用里点过五个页面。直接向 API 请求这个商品,然后看价格就行。
端点
你打开的地址由两部分组成。https://api.testingapis.com 是基础 URL:它说明要和哪台服务器通信。/api/Products/1 是路径:它说明你想从这台服务器得到什么。服务器能理解的每个路径都叫做一个端点(endpoint)。这个 API 有几百个端点。举几个例子:
| 路径 | 返回什么 |
|---|---|
/api/Products/1 | 编号为 1 的商品 |
/api/Products | 所有商品,以列表形式 |
/api/Products/categories | 商品分类 |
/api/Countries/code/IN登录后查看 | ISO 代码为 IN 的国家 |
/api/health | API 是否在运行 |
有哪些端点,要从 API 的文档里查。对这个 API 来说,就是 API 参考文档。真实项目在这方面差别很大。有的文档写得很用心,有的只有一个从代码生成的 OpenAPI 文件,有的只有编写它的开发者在聊天频道里留下的一条消息。发现文档和 API 不一致的地方,也是测试人员的工作之一。
当答案是“不”的时候
现在请求一个不存在的商品:
/api/Products/9999服务器回复:
{
"status": 404,
"error": "Not Found",
"message": "Product with ID 9999 does not exist."
}这同样是一个正确的响应。商品 9999 不存在,服务器清楚地说明了这一点:一个表示“未找到”的 404 状态,以及一条说明缺少哪个 ID 的消息。好的 API 对它无法满足的请求,和对它能满足的请求一样用心。很多 API 测试都发生在这里,也就是异常路径上,因为这是开发者花时间最少、bug 最多的地方。
为什么要在 API 层面测试
你也可以通过应用的界面来测试一切。团队之所以直接测试 API,有几个实际的原因。
- 更快。一个请求只需几毫秒。在界面上点击到同样的状态需要几秒钟,而把这些点击自动化,写起来要花长得多的时间,而且按钮一挪位置就会失效。
- API 通常先出现。后端和前端常常是并行开发的,所以在还没有任何可点击的东西之前,你就可以开始测试后端。
- 界面会掩盖问题。假设一个购物应用的数量输入框只允许输入 1 到 10。它背后的 API 收到的是普通请求,任何人都可以发送一个数量为 -5 的请求。如果服务器相信应用已经检查过,这个订单就会以负数总额通过。只有直接和 API 打交道,你才能发现这一点。
- 一个 API 往往服务多个客户端:网站、iPhone 应用、Android 应用、合作伙伴的集成。API 里的一个 bug 就是所有这些客户端里的 bug。
界面测试仍有它的位置,它是检查界面是否正常工作的唯一方法。但系统的规则(谁能看到什么、有效的订单是什么样的、库存用完时会发生什么)都在 API 里,所以要在 API 里检查它们。
练习
在浏览器中逐个打开下面的地址,记下返回的内容。
/api/Products/2/api/Countries/code/登录后查看 后面加上你所在国家的两字母代码/api/Products/9999,然后是/api/Products/abc
最后两个都以 404 失败,但失败的方式并不一样。仔细看看它们各自的响应体。你会把这个差异当作 bug 报告吗?没有唯一正确的答案。重要的是你注意到了,并且能解释为什么客户端可能会在意。