golang终端HTTP请求美化调试插件库httpretty的使用
Golang终端HTTP请求美化调试插件库httpretty的使用
httpretty是一个用于在终端上漂亮地打印Go程序HTTP请求的库。它主要受到curl的--verbose
模式以及httputil.DumpRequest
等函数的启发。
设置日志记录器
你可以这样定义一个日志记录器:
logger := &httpretty.Logger{
Time: true, // 显示时间
TLS: true, // 显示TLS信息
RequestHeader: true, // 显示请求头
RequestBody: true, // 显示请求体
ResponseHeader: true, // 显示响应头
ResponseBody: true, // 显示响应体
Colors: true, // 使用颜色显示(如果不喜欢可以删除这行)
Formatters: []httpretty.Formatter{&httpretty.JSONFormatter{}}, // 使用JSON格式化器
}
这段代码会设置一个合理的日志记录器。默认情况下,日志记录器只打印请求行(在服务器端使用时还会打印远程地址)。
客户端使用
你可以为你使用的*net/http.Client
设置传输器,如下所示:
client := &http.Client{
Transport: logger.RoundTripper(http.DefaultTransport),
}
// 从现在开始,你可以使用client.Do、client.Get等方法来创建请求。
如果你不关心设置新的客户端,可以安全地用以下代码替换现有的http.DefaultClient:
http.DefaultClient.Transport = logger.RoundTripper(http.DefaultClient.Transport)
然后,当调用如下代码时,httpretty会打印常规请求的信息到你的终端:
if _, err := http.Get("https://www.google.com/"); err != nil {
fmt.Fprintf(os.Stderr, "%+v\n", err)
os.Exit(1)
}
不过,请记住你通常需要使用自定义的*http.Client
来控制超时等设置。
服务器端日志记录
你可以快速使用日志记录器来记录服务器上的请求。例如:
logger.Middleware(mux)
处理程序应该是http.Handler。通常,你希望这是你的http.ServeMux
HTTP入口点。
过滤
有两种方法可以过滤请求,使其不被日志记录器打印。
httpretty.WithHide
你可以通过在请求到达httpretty.RoundTripper
之前设置请求上下文来过滤任何请求:
req = req.WithContext(httpretty.WithHide(ctx))
过滤函数
第二种选择是实现:
type Filter func(req *http.Request) (skip bool, err error)
并将其设置为日志记录器的过滤器。例如:
logger.SetFilter(func filteredURIs(req *http.Request) (bool, error) {
if req.Method != http.MethodGet {
return true, nil
}
if path := req.URL.Path; path == "/debug" || strings.HasPrefix(path, "/debug/") {
return true, nil
}
return false
})
格式化器
你可以通过实现Formatter接口为任何媒体类型定义格式化器。
我们提供了一个JSONFormatter方便使用(默认不启用)。
更多关于golang终端HTTP请求美化调试插件库httpretty的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang终端HTTP请求美化调试插件库httpretty的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Golang终端HTTP请求美化调试插件库httpretty使用指南
httpretty
是一个用于美化和调试HTTP请求的Golang库,它可以帮助开发者在终端中更直观地查看HTTP请求和响应的详细信息。
安装httpretty
go get github.com/henvic/httpretty
基本使用方法
1. 简单示例
package main
import (
"fmt"
"log"
"net/http"
"github.com/henvic/httpretty"
)
func main() {
// 创建httpretty logger
logger := &httpretty.Logger{
Time: true,
RequestHeader: true,
RequestBody: true,
ResponseHeader: true,
ResponseBody: true,
Colors: true, // 启用颜色
Formatters: []httpretty.Formatter{&httpretty.JSONFormatter{}},
}
// 创建HTTP客户端并设置logger
client := &http.Client{
Transport: logger.RoundTripper(http.DefaultTransport),
}
// 发送请求
resp, err := client.Get("https://jsonplaceholder.typicode.com/posts/1")
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
fmt.Println("Status:", resp.Status)
}
2. 自定义配置
logger := &httpretty.Logger{
// 显示时间戳
Time: true,
// 显示请求头
RequestHeader: true,
// 显示请求体
RequestBody: true,
// 显示响应头
ResponseHeader: true,
// 显示响应体
ResponseBody: true,
// 启用颜色输出
Colors: true,
// 最大显示内容长度(字节)
MaxResponseBody: 1000,
// 格式化JSON响应
Formatters: []httpretty.Formatter{&httpretty.JSONFormatter{}},
// 跳过SSL验证(仅用于调试)
SkipSanitize: true,
}
3. 过滤敏感信息
logger := &httpretty.Logger{
RequestHeader: true,
RequestBody: true,
ResponseHeader: true,
ResponseBody: true,
Colors: true,
// 添加过滤器来隐藏敏感信息
Filters: []httpretty.Filter{
// 隐藏Authorization头
httpretty.HideHeader("Authorization"),
// 自定义过滤器函数
func(content []byte) []byte {
// 替换密码字段
return bytes.Replace(content, []byte(`"password":`), []byte(`"password":"***"`), -1)
},
},
}
4. 仅记录特定请求
logger := &httpretty.Logger{
// 设置条件函数,只记录特定URL的请求
Cond: func(req *http.Request) bool {
return strings.Contains(req.URL.Host, "api.example.com")
},
RequestHeader: true,
RequestBody: true,
ResponseHeader: true,
ResponseBody: true,
}
高级用法
1. 与标准库集成
// 包装现有的Transport
transport := &http.Transport{
// 你的Transport配置
}
logger := &httpretty.Logger{
RequestHeader: true,
ResponseHeader: true,
}
client := &http.Client{
Transport: logger.RoundTripper(transport),
}
// 使用client发送请求
2. 自定义输出目标
// 创建自定义输出writer
var buf bytes.Buffer
logger := &httpretty.Logger{
RequestHeader: true,
ResponseHeader: true,
// 设置自定义输出
Writer: &buf,
}
// 使用后可以获取输出内容
output := buf.String()
fmt.Println(output)
3. 性能考虑
在生产环境中,建议禁用RequestBody和ResponseBody以减少性能开销:
logger := &httpretty.Logger{
RequestHeader: true,
RequestBody: false, // 生产环境禁用
ResponseHeader: true,
ResponseBody: false, // 生产环境禁用
}
实际应用场景
1. 调试REST API客户端
func createAPIClient() *http.Client {
logger := &httpretty.Logger{
Time: true,
RequestHeader: true,
RequestBody: true,
ResponseHeader: true,
ResponseBody: true,
Colors: true,
Formatters: []httpretty.Formatter{&httpretty.JSONFormatter{}},
}
return &http.Client{
Transport: logger.RoundTripper(http.DefaultTransport),
Timeout: 30 * time.Second,
}
}
2. 单元测试中的HTTP请求记录
func TestAPIRequest(t *testing.T) {
var buf bytes.Buffer
logger := &httpretty.Logger{
RequestHeader: true,
ResponseHeader: true,
Writer: &buf,
}
client := &http.Client{
Transport: logger.RoundTripper(http.DefaultTransport),
}
// 执行测试请求
resp, err := client.Get("http://example.com/api")
// 断言和验证
t.Logf("Request log:\n%s", buf.String())
}
总结
httpretty
是一个功能强大且灵活的HTTP请求调试工具,特别适合:
- 开发阶段调试API调用
- 记录HTTP交互用于文档或测试
- 分析第三方服务的请求/响应模式
- 教学和演示HTTP协议交互
通过合理配置,可以在开发环境中获得详细的HTTP交互信息,而在生产环境中保持简洁和高效。