API 在线测试工具
Postman 替代 · GET/POST/PUT/PATCH/DELETE/HEAD/OPTIONS · 浏览器本地
每行一个 Header,格式:Name: Value
JSON / 表单 / 文本
每行 key=value(自动 URL 编码)
Postman 替代/多 Method/历史
Postman 替代 · GET/POST/PUT/PATCH/DELETE/HEAD/OPTIONS · 浏览器本地
每行一个 Header,格式:Name: Value
JSON / 表单 / 文本
每行 key=value(自动 URL 编码)
了解工具定位 · 使用场景 · 对比优势
前端开发在对接后端 API 时,需要频繁测试 GET/POST/PUT/DELETE 等不同 Method 的响应。本工具支持保存多组请求历史,快速切换 Method 和请求体格式(JSON/Form),无需打开 Postman 即可在浏览器内完成联调,减少 IDE 与外部工具之间的切换成本。
测试人员在回归验证时,常遇到 Mock 服务返回的数据结构与线上不一致。利用本工具的历史记录功能,可保存每次请求的完整参数和响应,对比不同版本的返回体差异,快速定位字段缺失或类型变更,避免遗漏接口兼容性问题。
接入微信支付 / 阿里云等开放平台时,需要反复调试签名算法和请求头。本工具支持自定义 Header 和 Query 参数,搭配 Method 切换,能逐项验证签名计算是否正确、回调地址是否可达,在正式集成前消除配置错误。
后端开发在发布前需了解接口的响应耗时和状态码分布。通过本工具多次发起同一请求,观察每次的响应时间波动,配合状态码判断是否出现 500 或超时,快速识别慢查询或资源竞争问题,无需搭建压测环境。
OAuth2.0 或 JWT 鉴权中,需按顺序调用登录、刷新 Token、资源请求三个接口。本工具的请求历史功能可保留每次的 Token 和 Cookie,开发者能逐步验证每一步的返回是否正确,确保鉴权链路完整。
| 维度 | 本工具 | 竞品 A (Postman) | 传统方法 (cURL/脚本) |
|---|---|---|---|
| 数据隐私 | 纯浏览器处理,请求不经过第三方服务器 | 请求通过 Postman 云服务中转(需登录账号) | 完全本地执行,无外部传输 |
| 运行环境 | 无需安装,打开浏览器即用 | 需下载安装桌面客户端 | 需终端环境,依赖命令行技能 |
| 请求历史 | 自动保存在浏览器本地 (IndexedDB),关闭页面不丢失 | 需登录账号同步至云端,免费版有历史条数限制 | 需手动保存脚本或输出日志 |
| 协作共享 | 不支持团队协作 | 支持工作空间、团队库、分享集合 | 需通过 Git 或文件分享 |
| 离线可用 | 完全离线可用(页面加载后) | 桌面客户端可离线,部分功能(如同步)受限 | 完全离线可用 |
| 收费模式 | 免费,无功能限制 | 免费版有每月 API 调用次数限制,协作等功能需付费 | 免费(系统自带或开源工具) |
| 学习成本 | 零学习成本,界面直观 | 功能丰富但界面复杂,新手需学习 | 需记忆参数(-X, -H, -d 等),调试效率低 |
上手步骤 · 输入输出 · 避坑提示
| 输入 | 输出 | 说明 |
|---|---|---|
| GET https://jsonplaceholder.typicode.com/posts/1 | { "userId": 1, "id": 1, "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit", "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto" } | 典型场景:GET 请求获取单条资源 |
| POST https://jsonplaceholder.typicode.com/posts Content-Type: application/json {"title":"foo","body":"bar","userId":1} | { "title": "foo", "body": "bar", "userId": 1, "id": 101 } | 典型场景:POST 请求创建新资源 |
| DELETE https://jsonplaceholder.typicode.com/posts/1 | {} | 典型场景:DELETE 请求删除资源,返回空对象 |
| GET https://jsonplaceholder.typicode.com/posts/1/comments | [ { "postId": 1, "id": 1, "name": "id labore ex et quam laborum", "email": "Eliseo@gardner.biz", "body": "laudantium enim quasi est quidem magnam voluptate ipsam eos\ntempora quo necessitatibus\ndolor quam autem quasi\nreiciendis et nam sapiente accusantium" }, ... ] | 边界 case:GET 请求返回数组,需处理多对象 |
| PUT https://jsonplaceholder.typicode.com/posts/1 Content-Type: application/json {"id":1,"title":"updated title","body":"updated body","userId":1} | { "id": 1, "title": "updated title", "body": "updated body", "userId": 1 } | 边界 case:PUT 请求完整替换资源 |
| PATCH https://jsonplaceholder.typicode.com/posts/1 Content-Type: application/json {"title":"patched title"} | { "userId": 1, "id": 1, "title": "patched title", "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto" } | 边界 case:PATCH 请求部分更新,仅修改 title |
| GET https://jsonplaceholder.typicode.com/nonexistent | { "error": "Not Found" } | 易错 case:请求不存在的路径,返回 404 |
| POST https://jsonplaceholder.typicode.com/posts Content-Type: application/xml <post><title>foo</title><body>bar</body><userId>1</userId></post> | { "title": "foo", "body": "bar", "userId": 1, "id": 101 } | 易错 case:发送 XML 格式,API 仍返回 JSON |
curl -X GET -d '{"key":"value"}' https://api.example.com/resourcecurl -X GET https://api.example.com/resource?key=valueHTTP 规范允许 GET 带 body,但大多数服务器/代理会忽略或拒绝;参数应放 query string 或 path
curl -X POST -d 'name=test&age=18' https://api.example.com/usercurl -X POST -H 'Content-Type: application/x-www-form-urlencoded' -d 'name=test&age=18' https://api.example.com/user不指定 Content-Type,服务器可能无法正确解析 body;JSON 请求必须用 application/json
{"name": 'test'}{"name": "test"}JSON 标准(RFC 8259)强制双引号;单引号是 JS 对象字面量语法,JSON.parse 会报错
https://api.example.com/search?q=hello worldhttps://api.example.com/search?q=hello%20world空格、中文、&、= 等字符在 URL 中有特殊含义,必须用 encodeURIComponent 或工具自动编码
Authorization: Bearer token123Authorization: Bearer eyJhbGciOiJIUzI1NiIs...Bearer 后需空格 + 完整 token;常见错误:写成 'Bearer:'、'bearer'、或只传 token 值
PUT /api/user/1 -d '{"name":"new"}'PUT /api/user/1 -d '{"name":"new", "email":"old@example.com"}'PUT 是幂等替换,通常需传完整资源字段;只传部分字段可能导致其他字段被清空。PATCH 才适合部分更新
curl -X DELETE -d '{"reason":"test"}' https://api.example.com/resource/1curl -X DELETE https://api.example.com/resource/1多数 REST API 的 DELETE 不接受 body,参数通过 URL 路径或 query string 传递;body 会被忽略或报 400
?page=1&size=10 返回第 2 页时用 ?page=2&size=10?page=1&size=10 → 返回后检查响应中 totalPages,下一页用 ?page=2&size=10部分 API 的 page 从 0 开始(?page=0 为第一页),或使用 offset/limit 而非 page/size;需先确认 API 文档
POST /api/search?q=test&limit=10POST /api/search -H 'Content-Type: application/json' -d '{"q":"test","limit":10}'POST 的 body 应放在请求体中而非 URL;URL 参数用于 GET 或标识资源,POST body 用于传递操作数据
收到 201 Created 后以为请求失败,继续重试201 = 创建成功;200 = 成功;204 = 成功无内容;4xx = 客户端错误;5xx = 服务端错误很多新手只看响应体是否有 error 字段,忽略状态码;201 表示资源已创建,不应再发相同请求
公式推导 · 流程图解 · 依据出处
HTTP 请求 = Method + URL + Headers + Body
Method — 请求方法(GET/POST/PUT/DELETE 等)URL — 请求的目标资源地址Headers — 请求头(Content-Type/Authorization 等)Body — 请求体(JSON/Form/Text/Binary 等)测试一个 POST 请求:Method=POST,URL=https://api.example.com/users,Headers={Content-Type: application/json, Authorization: Bearer token123},Body={"name":"张三","email":"zhang@example.com"}。点击发送后,服务器返回 201 Created 及新用户 JSON 数据。
适用于所有基于 HTTP/HTTPS 协议的 RESTful API 测试场景。不适用于 WebSocket/gRPC 等非 HTTP 协议,也不适用于需要客户端证书的 mTLS 接口。基于 RFC 7231 HTTP/1.1 标准。
3 种主流语言 · 复制即用
import requests
# 发送 GET 请求并打印状态码与响应体
url = "https://api.github.com/users/octocat"
resp = requests.get(url, timeout=10)
print(resp.status_code) # 200
print(resp.json().get("login")) # octocat
# 发送 POST 请求(JSON 体)
post_url = "https://httpbin.org/post"
payload = {"name": "test", "value": 42}
resp = requests.post(post_url, json=payload, timeout=10)
print(resp.status_code) # 200
print(resp.json()["json"]) # {'name': 'test', 'value': 42}package main
import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
"time"
)
func main() {
// GET 请求
resp, _ := http.Get("https://api.github.com/users/octocat")
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
fmt.Println(resp.StatusCode) // 200
fmt.Println(string(body)) // 完整 JSON
// POST 请求
payload, _ := json.Marshal(map[string]any{"name": "test", "value": 42})
resp, _ = http.Post("https://httpbin.org/post", "application/json", bytes.NewReader(payload))
defer resp.Body.Close()
body, _ = io.ReadAll(resp.Body)
fmt.Println(string(body)) // 包含 json 字段的响应
_ = time.Second // 占位,避免 unused import
}// 使用 fetch(Node 18+ 或浏览器)
const url = 'https://api.github.com/users/octocat';
// GET 请求
fetch(url)
.then(res => {
console.log(res.status); // 200
return res.json();
})
.then(data => console.log(data.login)); // octocat
// POST 请求(async/await 风格)
(async () => {
const resp = await fetch('https://httpbin.org/post', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ name: 'test', value: 42 })
});
const json = await resp.json();
console.log(json.json); // { name: 'test', value: 42 }
})();8 个高频疑问
「HTTP / 网络速查」下的其他工具