Go Web开发:优雅处理HTTP请求Body

Go Web开发:优雅处理HTTP请求Body

HTTP请求Body的处理技巧

1. 问题背景

在Go Web开发中,由于性能考虑,标准库net/httpgin等框架在读取完request.Body后会清空内容,导致无法多次读取。这在需要调试或日志记录时会带来不便。

2. 解决方案

Go标准库提供了httputil.DumpRequest函数,可以在不影响后续处理的情况下获取完整的请求内容。

2.1 代码实现

import (
    "net/http/httputil"
    "fmt"
)

func logRequest(c *gin.Context) {
    requestDump, err := httputil.DumpRequest(c.Request, true)
    if err != nil {
        fmt.Println(err)
        return
    }
    log.Infoln("request json:", string(requestDump))
}

2.2 输出示例

INFO[2021-06-25 11:56:55.105] request json: POST /order/add?token=H9hS5y1z9k12sdada HTTP/1.0
Host: 127.0.0.1:5141
Connection: close
Accept: application/json, text/javascript, */*; q=0.01
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-cn
Content-Length: 85
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Origin: http://www.youkong.chat
Referer: http://www.youkong.chat/qr_pay/index.html
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 13_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.2(0x18000239) NetType/2G Language/zh_CN

{"user_id":"1","good_id":"2","c_id":"7"}

3. 功能特点

  1. 完整记录

    • 包含所有HTTP头信息
    • 保留请求体内容
    • 不影响后续处理
  2. 调试便利

    • 易于问题排查
    • 支持开发调试
    • 便于日志追踪

4. 使用场景

  1. 开发调试

    • API接口测试
    • 请求参数验证
    • 问题排查
  2. 日志记录

    • 请求审计
    • 访问日志
    • 安全监控

5. 注意事项

  1. 性能影响

    • 避免在高并发场景下全量记录
    • 考虑使用采样记录
    • 注意日志大小控制
  2. 安全考虑

    • 注意敏感信息过滤
    • 遵守数据保护规范
    • 控制日志访问权限
  3. 最佳实践

    • 仅在必要时记录完整请求
    • 实现请求内容过滤机制
    • 定期清理日志数据