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

1 回复

更多关于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请求调试工具,特别适合:

  1. 开发阶段调试API调用
  2. 记录HTTP交互用于文档或测试
  3. 分析第三方服务的请求/响应模式
  4. 教学和演示HTTP协议交互

通过合理配置,可以在开发环境中获得详细的HTTP交互信息,而在生产环境中保持简洁和高效。

回到顶部