Go Web开发:优雅处理HTTP请求Body
HTTP请求Body的处理技巧
1. 问题背景
在Go Web开发中,由于性能考虑,标准库net/http
和gin
等框架在读取完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. 功能特点
-
完整记录
- 包含所有HTTP头信息
- 保留请求体内容
- 不影响后续处理
-
调试便利
- 易于问题排查
- 支持开发调试
- 便于日志追踪
4. 使用场景
-
开发调试
- API接口测试
- 请求参数验证
- 问题排查
-
日志记录
- 请求审计
- 访问日志
- 安全监控
5. 注意事项
-
性能影响
- 避免在高并发场景下全量记录
- 考虑使用采样记录
- 注意日志大小控制
-
安全考虑
- 注意敏感信息过滤
- 遵守数据保护规范
- 控制日志访问权限
-
最佳实践
- 仅在必要时记录完整请求
- 实现请求内容过滤机制
- 定期清理日志数据