tool.xpcool.com/docs/api-contract.md
夏犀麟 954b9e9d8a
All checks were successful
Build and Deploy (tool.xpcool.com) / build-and-deploy (push) Successful in 1m1s
feat(router): 新增多个工具分类和路由配置
- 添加 TerminalIcon, GitBranchIcon, ApiIcon, BrushIcon, SoundIcon,
Table1Icon, LogoGithubIcon, ContrastIcon, Edit2Icon, ChartBarIcon,
EarthIcon, GitMergeIcon, SettingIcon, CurrencyExchangeIcon, MobileIcon,
WifiIcon, RocketIcon 等图标导入
- 新增 dev, design, health, study, travel, fun, online 七个工具分类
- 添加 SQL格式化、文本对比、JSON转代码、渐变生成器、占位图生成、
ASCII艺术、摩斯电码、正则可视化、Markdown表格、API构建器、
Gitignore生成器、代码转图片、颜色命名器、缩进转换、代码统计、
Hello World大全、JSON对比、环境变量解析、汇率换算、快递查询、
手机号归属地、IP信息查询、网络测试、网络测速等多个工具路由配置
- 新增 .env.example 配置文件模板
- 创建 docs/api-contract.md 后端接口契约文档
- 新增 api-builder 和 ascii-art 工具页面组件
- 更新 agents.md 添加接手必读指引和维护约定
- 创建 CHANGELOG.md 变更日志文档和工作日志记录
2026-08-24 22:11:12 +08:00

5.2 KiB
Raw Permalink Blame History

后端接口契约 · tool.xpcool.com

本文档定义工具箱「在线服务」分类所有工具的后端接口规范。 前端已通过 src/api/client.ts 统一请求,后端按本文档实现接口即可直接接入,前端无需改动。

通用约定

  • Base URL:前端通过环境变量 VITE_API_BASE 配置(如 https://api.xpcool.com),未配置时页面显示「后端未接入」。
  • 统一响应格式(所有接口):
    { "code": 0, "message": "ok", "data": { ... } }
    
    • code = 0 成功;非 0 失败,message 为可读错误信息(前端直接展示给用户)。
  • 编码UTF-8GET 参数走 Query StringPOST 走 JSON Body无需鉴权公开工具站
  • CORS:需要允许前端域名跨域(Access-Control-Allow-Origin: *)。
  • 建议实现限流(如单 IP 每分钟 60 次),防止免费接口被刷。

接口一览

# 接口 说明
1 GET /api/tools/exchange-rate 汇率换算
2 GET /api/tools/express-query 快递查询
3 GET /api/tools/phone-locate 手机号归属地
4 GET /api/tools/ip-info IP 信息查询
5 POST /api/tools/network-test 网络测试ping / tcp / dns
6 GET /api/tools/speedtest/download 下载测速(返回随机二进制流)
7 POST /api/tools/speedtest/upload 上传测速(接收二进制流)

1. 汇率换算 GET /api/tools/exchange-rate

参数from(源货币代码,如 CNYto(目标货币代码,如 USDamount(金额,可选,默认 1

响应 data

{
  "from": "CNY",
  "to": "USD",
  "rate": 0.1398,
  "amount": 100,
  "result": 13.98,
  "updated_at": "2026-08-24 17:00"
}

3. 快递查询 GET /api/tools/express-query

参数no(快递单号)

响应 data

{
  "no": "SF1234567890",
  "company": "顺丰速运",
  "status": "在途",
  "traces": [
    { "time": "2026-08-24 15:32", "desc": "快件已到达【深圳中转场】" },
    { "time": "2026-08-24 09:10", "desc": "快件已从【杭州】发出" }
  ]
}

4. 手机号归属地 GET /api/tools/phone-locate

参数phone11 位手机号)

响应 data

{
  "phone": "13800138000",
  "area": "北京",
  "carrier": "中国移动",
  "postcode": "100000",
  "updated_at": "2026-08-24 17:00"
}

5. IP 信息查询 GET /api/tools/ip-info

参数ipIPv4可选不传则查询请求方 IP

响应 data

{
  "ip": "1.2.3.4",
  "country": "中国",
  "province": "广东",
  "city": "深圳",
  "isp": "电信",
  "updated_at": "2026-08-24 17:00"
}

6. 网络测试 POST /api/tools/network-test

请求体

{ "type": "ping", "host": "baidu.com", "port": null, "timeout": 5000 }
字段 必填 说明
type ping / tcp / dns
host 主机名或 IP
port tcp 必填 目标端口1-65535其他类型传 null
timeout 超时毫秒,默认 5000

响应 data

{
  "type": "ping",
  "host": "baidu.com",
  "port": null,
  "reachable": true,
  "latency_ms": 23.5,
  "detail": { "min_ms": 20.1, "avg_ms": 23.5, "max_ms": 28.3, "loss_pct": 0 }
}

各类型 detail 字段约定:

type detail 字段 说明
ping min_ms / avg_ms / max_ms / loss_pct 3 次探测的最小/平均/最大延迟ms与丢包率0-100
tcp tcp_connect_ms TCP 握手耗时ms
dns dns_resolve_ms / ip 解析耗时与解析出的 IP

reachable=falselatency_ms 传 0detail{ "error": "错误描述" }

7. 网络测速

下载测速 GET /api/tools/speedtest/download?size=10485760

  • 返回 200 + application/octet-stream 随机字节流(不是 JSON响应头需带 Content-Length(前端据此显示进度)。
  • size 为请求的字节数(建议支持 5MB ~ 50MB
  • 前端流式读取并按耗时计算下载 Mbps无需后端返回额外数据。

上传测速 POST /api/tools/speedtest/upload

  • 请求体:application/octet-stream 原始二进制(前端生成随机数据上传)。
  • 响应 JSON
{ "code": 0, "message": "ok", "data": { "bytes": 5242880, "duration_ms": 812, "speed_mbps": 51.6 } }
字段 说明
bytes 实际接收字节数
duration_ms 接收耗时ms
speed_mbps 后端计算的上传速度Mbps

建议:下载测速时每次生成新的随机数据(crypto/rand),避免被缓存/CDN 命中导致测速失真;响应头 Cache-Control: no-store


错误示例

{ "code": 40001, "message": "城市不存在,请检查输入", "data": null }
code 含义
40001 参数不合法(如城市不存在、单号格式错误)
50001 上游数据源异常
50002 频率限制,请稍后重试

前端接入说明

  1. 复制 .env.example.env,填写 VITE_API_BASE=https://api.xpcool.com
  2. 重启 pnpm dev,在线服务分类的工具即可请求
  3. 后端实现时对照各接口的响应 data 字段,字段名保持一致即可(前端已按契约类型化)