← Go 语言开发

Go 语言开发

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

·Go 语言开发

详细介绍在Go Web开发中如何正确处理和打印HTTP请求Body,包括多次读取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. 最佳实践
    - 仅在必要时记录完整请求
    - 实现请求内容过滤机制
    - 定期清理日志数据