【Gin】HTTP 请求调试器
文章目录
- 项目概述
- 代码功能详解
- 1. 导入必要的包
- 2. 主函数和路由设置
- 3. 请求信息捕获
- 4. 请求参数和头信息
- 5. 请求体处理
- 5.1 JSON 数据处理
- 5.2 表单数据处理
- 5.3 Multipart 表单数据处理
- 5.4 其他类型数据处理
- 6. 构造响应对象
- 7. 返回 JSON 响应
- 功能特点
- 使用场景
- 完整代码
项目概述
这个 Gin HTTP 请求调试器是一个功能完整的工具,用于测试和调试前端接口调用。它能够捕获并记录所有请求信息,并以清晰的结构化方式展示这些信息。这个工具特别适合 API 开发、Webhook 调试、第三方服务集成验证等场景。
代码功能详解
1. 导入必要的包
import ("encoding/json""fmt""io""net/http""strings""time""github.com/gin-gonic/gin"
)
encoding/json
: 用于 JSON 数据的编码和解码fmt
: 用于格式化输入输出io
: 提供基本的 I/O 操作net/http
: 提供 HTTP 相关功能strings
: 提供字符串操作函数time
: 提供时间相关功能github.com/gin-gonic/gin
: Gin Web 框架,用于构建 HTTP 服务器
2. 主函数和路由设置
func main() {r := gin.Default()r.Any("/*path", func(c *gin.Context) {// 请求处理逻辑})// 启动服务fmt.Println("HTTP Request Debugger is running on http://localhost:8080")r.Run(":8080")
}
gin.Default()
: 创建一个默认的 Gin 路由器r.Any("/*path", ...)
: 定义一个通用的路由处理器,可以处理所有 HTTP 方法r.Run(":8080")
: 启动 HTTP 服务器,监听 8080 端口
3. 请求信息捕获
// 获取请求基本信息
url := c.Request.URL.String()
method := c.Request.Method
protocol := c.Request.Proto
host := c.Request.Host
path := c.Param("path")
clientIP := c.ClientIP()
timestamp := time.Now().Format("2006-01-02 15:04:05.000")
requestID := fmt.Sprintf("%d", time.Now().UnixNano())
url
: 完整的请求 URLmethod
: HTTP 方法(GET, POST, PUT, DELETE 等)protocol
: HTTP 协议版本(如 HTTP/1.1)host
: 请求的主机名path
: 请求路径clientIP
: 客户端的 IP 地址timestamp
: 请求时间戳,精确到毫秒requestID
: 唯一的请求 ID,基于时间戳生成
4. 请求参数和头信息
// 获取请求参数
params := c.Request.URL.Query()
// 获取请求头
headers := make(map[string]string)
for k, v := range c.Request.Header {headers[k] = strings.Join(v, ", ")
}
params
: 获取 URL 查询参数headers
: 获取所有请求头信息,并转换为字符串形式的键值对
5. 请求体处理
// 处理不同类型的请求体
contentType := c.Request.Header.Get("Content-Type")
var data interface{}
var rawBody []byte
contentType
: 获取请求体的内容类型data
: 用于存储解析后的请求数据rawBody
: 用于存储原始请求体
5.1 JSON 数据处理
if strings.Contains(contentType, "application/json") {// 处理JSON数据bodyBytes, err := io.ReadAll(c.Request.Body)if err != nil {c.JSON(http.StatusBadRequest, gin.H{"error": "cannot read body"})return}rawBody = bodyBytesvar jsonData map[string]interface{}if err := json.Unmarshal(bodyBytes, &jsonData); err == nil