English | 中文
ReqTap 是一个跨平台、零外部依赖的 HTTP 请求捕获与调试平台。单个可执行文件即可同时提供 CLI 采集器、SQLite 持久化存储以及带 WebSocket 的图形化控制台,帮助你在本地、容器、CI 乃至边缘节点快速观察、回放并转发各类 HTTP 调用。
通过 ReqTap,你可以:
- 在 CLI 中实时查看彩色 HTTP 报文,同时输出结构化日志供管线消费;
- 将所有历史请求落入嵌入式 SQLite,并基于筛选/搜索/导出进行回溯分析;
- 通过 Web 控制台或 API 即时订阅最新流量,或批量导出 JSON/CSV/TXT;
- 将请求二次转发到任意下游,并灵活改写路径、重试或附加追踪头。
- Webhook 与自动化平台调试:本地劫持 GitHub、Stripe、Zapier、n8n 等回调,快速定位报文差异。
- 多端 API 开发验证:移动端、Web、IoT 同时指向 ReqTap,统一查看与转发测试环境服务。
- 微服务与网关故障排查:在流量入口收集真实请求,结合重放/导出快速复现实例。
- 零信任/安全审计:对外暴露最小功能,所有命中请求均持久化并可离线分析。
- 课堂演示与培训:利用终端彩色输出 + Web UI 展示 HTTP 报文结构、常见 Header、Body 差异。
- DevOps / SRE 诊断:配合
--json输出与文件日志,在 CI、GitHub Actions、Kubernetes Job 中捕获一次性流量。 - 设备/SDK 数据回放:当真实服务不可用时,利用即时响应规则模拟接口并将真实数据存盘回放。
- 轻量部署:单二进制 + 内嵌 SQLite,默认以 WAL 与 busy-timeout 运行,无需额外数据库或消息队列。
- 内建持久化:
storage.max_records、storage.retention既可按数量也可按时间裁剪历史,并支持 JSON/CSV/Text 全量导出。 - 请求重放:从历史记录中选择请求,可修改目标地址、Headers、Body、Query 后重新发送,支持查看完整重放历史并记录响应时间与状态码。
- 即时响应编排:
server.responses针对方法/路径设置状态码、Body、Header,快速模拟外部依赖或兜底响应。 - 高可读 CLI 输出:使用 runewidth 适配多语言终端,自动检测二进制体、智能脱敏敏感 Header,并支持十六进制预览/落盘。
- 异步多路转发:Forwarder 内置限流、超时、重试与并发控制,配合路径策略 (
append/strip_prefix/rewrite) 适配不同环境。 - Web 控制台 + WebSocket:Session 登录、暗黑模式、筛选、详情弹窗、批量导出,一切基于统一的持久化存储实现。
- 统一配置体验:Cobra + Viper 让 CLI 参数、环境变量、YAML 相互覆盖,启动 Banner 与结构化日志会打印最终配置。
- 日志与审计:支持 zerolog JSON 流 + lumberjack 文件滚动,
--silence与--json适配 CI/日志管线。 - 跨平台友好:Mac/Linux/Windows 官方预编译,亦可通过 Docker、Homebrew 或脚本一键安装。
- 安全/可控:所有外发 Header 均可黑白名单过滤,二进制体默认不打印,支持只读导出 API 以集成到现有监控面板。
- 多语言体验:CLI 可通过
output.locale/--locale切换语言,Web 控制台默认按浏览器语言选择并支持下拉即时切换,内置英文、简体中文、日文、韩文、法文、俄文支持。
macOS 用户首选的安装方式是使用 Homebrew:
# 添加 tap
brew tap funnyzak/reqtap
# 安装 reqtap
brew install reqtap
# 更新
brew update && brew upgrade reqtap最简单的跨平台安装方式是使用的安装脚本:
curl -fsSL https://raw.githubusercontent.com/funnyzak/reqtap/main/scripts/install.sh | bash或者下载后手动运行:
# 下载脚本
curl -fsSL https://raw.githubusercontent.com/funnyzak/reqtap/main/scripts/install.sh -o install.sh
# 运行脚本
chmod +x install.sh
./install.sh脚本支持多个命令:
install- 安装 ReqTap(默认)update- 更新到最新版本uninstall- 卸载 ReqTapcheck- 检查已安装版本和可用更新list- 列出所有可用版本
示例:
# 安装最新版本
curl -fsSL https://raw.githubusercontent.com/funnyzak/reqtap/main/scripts/install.sh | bash -s install
# 安装指定版本
curl -fsSL https://raw.githubusercontent.com/funnyzak/reqtap/main/scripts/install.sh | bash -s install -v 0.1.5
# 更新到最新版本
curl -fsSL https://raw.githubusercontent.com/funnyzak/reqtap/main/scripts/install.sh | bash -s update- 访问 发布页面
- 下载适合您平台的二进制文件:
reqtap-linux-amd64用于 Linux x86_64reqtap-linux-arm64用于 Linux ARM64reqtap-linux-arm用于 Linux ARMv7reqtap-linux-ppc64le用于 Linux PowerPC 64 LEreqtap-linux-riscv64用于 Linux RISC-V 64reqtap-linux-s390x用于 Linux IBM Zreqtap-darwin-amd64用于 macOS Intelreqtap-darwin-arm64用于 macOS Apple Siliconreqtap-windows-amd64.exe用于 Windows x86_64
- 添加可执行权限(Unix 系统):
chmod +x reqtap-* mv reqtap-* reqtap
# 拉取最新镜像
docker pull funnyzak/reqtap:latest
# 使用默认设置运行 ReqTap
docker run -p 38888:38888 funnyzak/reqtap:latest
# 使用自定义配置运行
docker run -p 8080:38888 -v $(pwd)/config.yaml:/app/config.yaml funnyzak/reqtap:latest --config /app/config.yaml# 克隆仓库
git clone https://github.com/funnyzak/reqtap.git
cd reqtap
# 为当前平台构建
make build
# 或直接使用 Go 构建
go build -o reqtap ./cmd/reqtap-
使用默认设置启动
reqtap
默认监听
http://0.0.0.0:38888/reqtap -
自定义端口和路径
reqtap --port 8080 --path /reqtap/
-
启用文件日志记录
reqtap --log-file-enable --log-file-path ./reqtap.log
-
转发到多个目标
reqtap --forward-url http://localhost:3000/webhook --forward-url https://api.example.com/ingest
-
自定义持久化策略
reqtap --storage-path /var/lib/reqtap/requests.db --storage-max-records 50000 --storage-retention 168h
启动 Banner 与结构化日志会同时输出生效的存储配置,方便在多环境比对。
当 web.enable 为 true(默认值)时,ReqTap 会自动提供一个零依赖的网页控制台,默认入口为 http://<host>:<port>/web,它可以:
- 使用 Session 登录控制台(默认账号:
admin/admin123,user/user123,请及时修改) - 通过 WebSocket 实时流观察最新请求
- 根据 HTTP 方法、路径、Query、头部或来源 IP 进行筛选/搜索
- 在模态窗口中查看完整的请求详情(Headers + Body)
- 请求重放:选择历史请求,可修改目标地址、方法、Headers、Body、Query 参数后重新发送到任意服务器,系统会自动记录重放结果(状态码、响应体、响应时间),支持查看该请求的完整重放历史
- 一键导出当前视图为 JSON、CSV 或纯文本
- 在控制台右上角切换暗色/亮色主题,偏好会自动保存在浏览器中
- 登录页同样提供暗色/亮色主题切换,确保进入控制台前体验一致
- CLI 输出:通过
output.locale或启动参数--locale指定终端语言,默认回退到英文;go run cmd/reqtap --locale zh-CN可立即体验中文提示。 - Web 控制台:
web.default_locale定义首次加载语言,web.supported_locales决定下拉可选项。内置英文、简体中文、日文、韩文、法文、俄文翻译,支持在右上角语言菜单即时切换并记忆到浏览器。 - 自定义扩展:编辑
internal/static/locales/*.json(或构建后的同名资源)即可新增语言,使用前端专用的键结构,缺失条目会自动回退至英文,保证界面完整性。 - 查看支持语言:执行
reqtap locales可打印当前版本 CLI 与 Web 控制台可用语言列表,并提示对应配置键位。
当前二进制内置 en、zh-CN、ja、ko、fr、ru 六种语言,CLI 与 Web 控制台共用同一组翻译目录。常见配置入口如下:
| 组件 | 配置入口 | 默认值 | 说明 |
|---|---|---|---|
| CLI 输出 | output.locale / --locale |
en |
启动后立即切换终端提示语言,可随时通过命令行覆盖配置文件。 |
| Web 默认语言 | web.default_locale |
en |
控制网页首次渲染时使用的语言,若浏览器偏好匹配受支持语言则会自动覆盖。 |
| Web 可选语言 | web.supported_locales |
[en, zh-CN, ja, ko, fr, ru] |
决定语言下拉框中出现的列表。 |
示例配置:
output:
locale: "zh-CN"
web:
default_locale: "zh-CN"
supported_locales:
- zh-CN
- en
- ja- 命名规范:
- CLI 侧使用
pkg/i18n/locales/<lang>.yaml(如en.yaml,zh-CN.yaml),采用cli.*命名空间(如cli.summary.title)。 - Web 侧使用
internal/static/locales/<lang>.json,使用前端专用的键结构(如detail.meta.request_id)。 - 两个子系统使用不同的命名空间,避免直接混用。
- CLI 侧使用
- 新增语言:
- 复制英文模板文件为新语言,补全需要的条目;CLI 若只需覆盖部分键,可删除未修改的条目,空缺会自动兜底英文。
- 在
web.supported_locales与output.locale/web.default_locale中加入新语言代码(示例:fr或fr-FR)。
- 运行验证:执行
go test ./pkg/i18n ./internal/printer确保 CLI 词条无缺;构建静态资源或启动make dev,在浏览器切换语言核验 UI。 - 提交前检查:若移除了键名,请同步更新 README 里的“多语言支持”说明,避免遗漏维护指南。
- 请求详情弹窗提供 Headers/Body 独立工具:可单独复制、切换换行/横向滚动,并在 JSON Raw/Pretty 视图间一键切换
- 重新设计的布局将页面头部、统计卡片与筛选面板固定可视,仅主体列表区域滚动,长列表体验更佳
- 管理员可对任一请求直接复制/下载 Request 报文、复制/下载固定 Response 报文,以及复制可直接重放的 cURL 命令
控制台使用的 API 位于可配置的 web.admin_path(默认 /api)下:
| Method | Path | 说明 |
|---|---|---|
POST |
/api/auth/login |
账号登录,创建 Session |
POST |
/api/auth/logout |
退出登录 |
GET |
/api/auth/me |
获取当前用户信息 |
GET |
/api/requests |
查询最近请求,支持 search、method、limit、offset |
GET |
/api/export |
根据过滤条件导出 JSON/CSV/TXT |
GET |
/api/ws |
WebSocket 通道,实时推送新请求 |
POST |
/api/replay |
重放请求,支持修改目标地址、方法、Headers、Body、Query |
GET |
/api/replays |
查询请求的重放历史,参数 request_id |
通过配置文件的 web 段可以调整访问路径、最大缓存数量,或完全关闭 Web 控制台。
- 使用 curl 快速测试
curl -X POST http://localhost:38888/reqtap \ -H "Content-Type: application/json" \ -d '{"message": "Hello, ReqTap!"}'
用法:
reqtap [flags]
标志:
-c, --config string 配置文件路径 (默认 "config.yaml")
-p, --port int 监听端口 (默认 38888)
--path string 要监听的 URL 路径前缀 (默认 "/reqtap")
--max-body-bytes int 单个请求体允许的最大大小(字节,0 表示无限制)(默认 10485760)
-l, --log-level string 日志级别: trace, debug, info, warn, error, fatal, panic (默认 "info")
--log-file-enable 启用文件日志
--log-file-path string 日志文件路径 (默认 "./reqtap.log")
--log-file-max-size int 单个日志文件的最大大小(MB)(默认 10)
--log-file-max-backups int 保留的旧日志文件最大数量 (默认 5)
--log-file-max-age int 旧日志文件的最大保留天数 (默认 30)
--log-file-compress 是否压缩旧日志文件 (默认 true)
--silence 静默模式,不打印 banner 和请求详情
--json 输出 JSON 日志,便于 CI / 日志系统
--body-view 启用多格式正文展示(JSON 缩进、表单表格等)
--body-preview-bytes int 控制台正文预览的最大字节数(超过即截断)
--full-body 无视预览限制,始终输出完整请求体
--body-hex-preview 为二进制正文开启十六进制预览
--body-hex-preview-bytes int 十六进制预览字节上限
--body-save-binary 将二进制正文落盘保存
--body-save-directory string 自定义二进制落盘目录(需配合 --body-save-binary)
-f, --forward-url stringSlice 要转发请求的目标 URL
--forward-timeout int 转发请求超时时间(秒)(默认 30)
--forward-max-retries int 转发请求的最大重试次数 (默认 3)
--forward-max-concurrent int 最大并发转发请求数 (默认 10)
-h, --help 显示帮助信息
-v, --version 显示版本信息
创建 config.yaml 文件用于持久化配置:
# 服务器配置
server:
port: 38888
path: "/reqtap"
max_body_bytes: 10485760 # 单个请求体的最大字节数,0 表示不限制
responses:
- name: "demo-json"
methods: ["POST"]
path_prefix: "/reqtap/demo"
status: 202
body: '{"status":"queued"}'
headers:
Content-Type: application/json
- name: "default-ok"
status: 200
body: "ok"
headers:
Content-Type: text/plain
# 日志配置
log:
level: "info" # trace, debug, info, warn, error, fatal, panic
file_logging:
enable: true
path: "./reqtap.log"
max_size_mb: 10 # 每个文件的最大大小(MB)
max_backups: 5 # 旧日志文件的最大数量
max_age_days: 30 # 最大保留天数
compress: true # 压缩旧日志文件
# 转发配置
forward:
urls:
- "http://localhost:3000/webhook"
- "https://api.example.com/ingest"
timeout: 30 # 请求超时时间(秒)
response_header_timeout: 15 # 响应头超时时间(秒),防止上游挂起
tls_handshake_timeout: 10 # TLS 握手超时(秒)
expect_continue_timeout: 1 # Expect-Continue 等待时间(秒)
max_retries: 3 # 最大重试次数
max_concurrent: 10 # 最大并发转发数
max_idle_conns: 200 # 最大空闲连接数
max_idle_conns_per_host: 50 # 每主机最大空闲连接数
max_conns_per_host: 100 # 每主机最大连接数
idle_conn_timeout: 90 # 空闲连接超时(秒)
tls_insecure_skip_verify: false # 是否跳过 TLS 校验(仅限测试环境)
path_strategy:
mode: "strip_prefix" # append / strip_prefix / rewrite
strip_prefix: "/reqtap" # strip_prefix 为空时默认使用 server.path
# rewrite 模式示例
# rules:
# - name: "rewrite-service"
# match: "/service"
# replace: "/api"
# - name: "regex-tenant"
# match: "^/tenant/(.*)$"
# replace: "/$1"
# regex: true
# Header 过滤,黑名单先于白名单;白名单非空时只转发列出的 Header
header_blacklist:
- "host"
- "connection"
- "keep-alive"
- "proxy-authenticate"
- "proxy-authorization"
- "te"
- "trailers"
- "transfer-encoding"
- "upgrade"
- "content-length"
header_whitelist: []
> **Forward 提示**
> - `urls` 可配置多个下游地址,ReqTap 会并发发送,并遵循 `timeout`、`max_retries` 等限制。
> - `path_strategy.mode` 为 `append` 时保持默认行为(直接拼接原始路径);`strip_prefix` 会在转发前剥离监听前缀(默认使用 `server.path`);`rewrite` 则按 `rules` 顺序执行前缀或正则改写。
> - 例如:在本例配置下,外部命中的 `/reqtap/demo` 会被裁剪成 `/demo` 后再转发到目标 URL,减少多环境路径差异。
> - 更多场景与转发链路说明参见下方“Path Strategy 行为详解”。
#### Path Strategy 行为详解
沿用上面的示例配置:`server.path=/reqtap`,`forward.urls` 指向 `http://localhost:3000/webhook` 与 `https://api.example.com/ingest`。ReqTap 接收请求后会先校验是否落在监听路径,然后依据 `path_strategy` 生成新的路径,最终把结果拼接到每个下游 URL 并按并发/重试策略发送。不同模式的行为如下:
- **统一监听但后端已含完整前缀(append)**
请求 `POST https://demo.test/reqtap/webhooks/payment` 命中监听器后保持 `/reqtap/webhooks/payment` 不变,因此会被转发为 `http://localhost:3000/webhook/reqtap/webhooks/payment` 与 `https://api.example.com/ingest/reqtap/webhooks/payment`。适合后端已经内置 `/webhooks/...` 等结构、无需额外重写的情况,保证“所见即所得”。
- **多环境前缀不一致(strip_prefix)**
配置 `mode=strip_prefix` 且 `strip_prefix=/reqtap`(为空时回退到 `server.path`)。当命中 `GET /reqtap/demo/health` 时,ReqTap 先剥离 `/reqtap`,再把 `/demo/health` 拼接到每个 `forward.urls`;于是 `https://api.example.com/ingest` 会收到 `https://api.example.com/ingest/demo/health`。此模式让本地调试可以维持统一入口 `/reqtap/*`,而下游只感知真实业务路径。
- **多租户或版本改写(rewrite)**
设置 `mode=rewrite` 并定义 `rules`。例如规则一:`match: "/service"` → `replace: "/api"`;规则二:`match: "^/tenant/(.*)$"`、`replace: "/$1"`、`regex: true`。请求 `/reqtap/tenant/acme/orders` 首先(按需)剥离 `/reqtap`,再按顺序执行规则:第二条将路径转换为 `/acme/orders`,最终转发为 `https://api.example.com/ingest/acme/orders`。规则按声明顺序匹配,若均未命中则保留当前路径,可借此组合前缀/正则实现灰度迁移。
无论使用哪种模式,处理后的路径都会复制给全部 `forward.urls` 并继续受 `timeout`、`max_retries` 等限制约束,因此在多下游转发时也能保持一致的路径规范。
# Web 控制台
web:
enable: true
path: "/web"
admin_path: "/api"
max_requests: 500
auth:
enable: true
session_timeout: 24h
users:
- username: "admin"
password: "admin123"
role: "admin"
- username: "user"
password: "user123"
role: "viewer"
export:
enable: true
formats: ["json", "csv", "txt"]
# CLI 输出
output:
mode: "console" # console / json
silence: false # true 时不打印彩色输出
body_view:
enable: false
max_preview_bytes: 32768
full_body: false
json:
enable: true
pretty: true
max_indent_bytes: 131072
form:
enable: true
xml:
enable: true
pretty: true
strip_control: true
html:
enable: true
pretty: false
strip_control: true
binary:
hex_preview_enable: false
hex_preview_bytes: 256
save_to_file: false
save_directory: ""
# 持久化存储
storage:
driver: "sqlite" # 目前仅支持 sqlite
path: "./data/reqtap.db" # 单文件数据库路径,可使用绝对路径
max_records: 100000 # 超出后删除最早的请求
retention: 0s # >0 时按时间窗口删除,例如 "168h"
> **Storage 提示**
> - SQLite 采用 WAL + busy timeout,单实例即可满足 macOS/Linux/Windows/容器等常见环境,无需额外服务。
> - `max_records` 与 `retention` 可组合使用:先删过期数据,再按数量裁剪,保证磁盘占用可控。
> - CLI 可通过 `--storage-path`, `--storage-max-records`, `--storage-retention` 等快速覆盖配置,启动 banner 会显示最终的存储位置与策略。
> - 旧的 `web.max_requests` 不再控制历史保留数量,如需限制请改用 `storage.max_records`/`storage.retention`。默认情况下会限制请求体为 10 MB,可通过 server.max_body_bytes 或 --max-body-bytes 调整,设置为 0 表示不做限制。
其中:
server.responses以声明式方式模拟不同的响应,支持path、path_prefix、methods组合匹配,第一条匹配即生效;path/path_prefix必须写入包含server.path(默认/reqtap)的完整路径。forward.path_strategy允许在转发阶段去除监听前缀或执行自定义重写,避免多环境回调 URL 不一致。output.mode与output.silence分别控制彩色输出/JSON 行与静默模式,也可通过--json、--silence临时覆盖。output.body_view负责多格式正文展示:开启后可自动对 JSON 缩进(含最大缩进阈值)、表单体转表格、XML/HTML 美化或剥离控制字符,并为二进制体提供十六进制预览与落盘;CLI 可用--body-view、--body-preview-bytes、--full-body、--body-hex-preview、--body-hex-preview-bytes、--body-save-binary、--body-save-directory即时覆盖相关开关及限额。
使用配置文件:
reqtap --config config.yaml# 监听 8080 端口,启用 Web 控制台,转发到本地开发服务
reqtap --port 8080 --web.enable --forward-url http://localhost:3000/webhook# 详细日志模式,记录所有请求信息
reqtap --log-level debug --log-file-enable --log-file-path ./audit.log# 使用 JSON 输出便于解析,可搭配 --silence 禁用彩色输出
reqtap --json --forward-url https://ci.local/collector配置按以下顺序加载(优先级从高到低):
- 命令行参数
- 环境变量
- 配置文件
- 默认值
ReqTap 由若干松耦合的内部包组成,每个包都负责请求生命周期中的一个阶段:
- CLI 启动层(
cmd/reqtap):基于 Cobra/Viper 组合命令行参数、环境变量与 YAML 配置,启动前完成配置校验并输出运行信息。 - 配置与日志(
internal/config,internal/logger):config统一默认值、加载顺序与约束校验;logger使用 zerolog + lumberjack 在终端和彩色滚动日志之间共享一套结构化日志接口。 - HTTP 服务层(
internal/server):利用 Gorilla Mux 构建路由,Handler会在读取完请求体后立即返回 200 OK,真正的处理逻辑在后台 goroutine 中异步执行。 - 请求处理流水线(
pkg/request,internal/printer,internal/web,internal/forwarder):RequestData将原始http.Request规范化;随后通过sync.WaitGroupfan-out 到控制台打印、SQLite 持久化与 WebSocket 推送以及多目标转发,实现彼此独立的消费者。 - 持久化存储(
internal/storage):统一的storage.Store接口和 SQLite 实现,负责写入/查询/裁剪请求历史,默认启用 WAL + BusyTimeout 以保证单二进制部署下的跨平台稳定性。 - 转发器(
internal/forwarder):维持一个有界 worker 池,结合context.Context超时和指数退避重试策略,将请求复制到所有目标地址并补充X-ReqTap-*追踪头。 - Web 控制台(
internal/web,internal/static):复用storage.Store获取历史数据,并提供 Session 登录管理、WebSocket 推送、JSON/CSV/TXT 流式导出以及内嵌前端资源,可通过web.path/web.admin_path在任意前缀下提供 UI 与 API。 - 可观测性:所有组件都依赖同一个
logger.Logger接口输出关键字段,便于在 CLI 与文件日志之间保持一致的调试体验。
Clients --> gorilla/mux Router --> Handler --> immediate 200 OK
|
|-- ConsolePrinter (彩色输出 / 脱敏)
|-- Storage.Store (SQLite WAL + 过滤/导出)
|-- Web Service (REST + WebSocket)
`-- Forwarder (worker pool + retries --> Targets)
- CLI 入口解析 flag/env/config 并创建 Logger、Forwarder、ConsolePrinter 与 Web Service 等依赖。
- Gorilla Mux 捕获任意匹配
server.path的请求,Handler 读取完整请求体后立即向客户端返回200 OK与ok文本,保证调用方不被阻塞。 - Handler 将请求转换为
RequestData,记录基础信息,并写入storage.Store,随后将持久化结果广播给 WebSocket 客户端。 - 控制台打印器以动态终端宽度渲染彩色输出,同时根据内置规则自动检测二进制内容并对敏感 header 做脱敏。
- 若配置了转发地址,Forwarder 会在独立 goroutine 中并发向所有目标发送请求,遵循超时、最大并发和重试策略,遇到 4xx/5xx 会按指数退避重试并输出结构化日志。
- 所有后台任务完成后该请求的 goroutine 才会退出,确保转发和日志写入完成,但不会影响已经返回的客户端响应。
- Go 1.21 或更高版本
- Make(可选,用于构建脚本)
# 为当前平台构建
make build
# 为所有平台交叉编译
make build-all
# 运行测试
make test
# 运行测试并生成覆盖率报告
make test-coverage
# 安装依赖
make deps
# 清理构建产物
make clean# 为当前平台构建
go build -o reqtap ./cmd/reqtap
# 为特定平台构建
GOOS=linux GOARCH=amd64 go build -o reqtap-linux-amd64 ./cmd/reqtap
GOOS=darwin GOARCH=amd64 go build -o reqtap-darwin-amd64 ./cmd/reqtap
GOOS=windows GOARCH=amd64 go build -o reqtap-windows-amd64.exe ./cmd/reqtap
# 构建时包含版本信息
go build -ldflags "-X main.version=0.1.5" -o reqtap ./cmd/reqtap-
克隆仓库
git clone https://github.com/funnyzak/reqtap.git cd reqtap -
安装依赖
go mod download make deps
-
运行测试
make test -
在开发模式下运行
go run ./cmd/reqtap --log-level debug
reqtap/
├── cmd/reqtap/main.go # Cobra CLI 与服务器入口
├── internal/
│ ├── config/ # 配置默认值、加载与校验
│ ├── forwarder/ # 多目标转发、重试与并发控制
│ ├── logger/ # zerolog 适配器 + 可选文件日志
│ ├── printer/console.go # 终端彩色打印与敏感信息脱敏
│ ├── server/ # Gorilla Mux 服务器和 Handler
│ ├── static/ # 内嵌 Web 控制台静态资源
│ └── web/ # Dashboard API、WebSocket、存储、认证
├── pkg/request/request.go # RequestData 结构与辅助函数
├── scripts/install.sh # 安装/升级脚本
├── config.yaml.example # 配置示例
├── Dockerfile
├── Makefile
├── README.md / README-EN.md
└── build/, logs/ # 可选的构建产物和滚动日志输出
本项目采用 MIT 许可证。


