Golang net.http.httputil 包详解
net/http/httputil
包提供了一些用于处理HTTP请求和响应的工具函数。其中最常用的是 httputil.DumpRequest
和 httputil.DumpResponse
函数,它们可以用来打印HTTP请求和响应的详细信息。
以下是一个使用 DumpRequest
和 DumpResponse
的简单示例:
package main
import (
"bytes"
"fmt"
"io/ioutil"
"net/http"
"net/http/httputil"
)
func main() {
client := &http.Client{}
req, err := http.NewRequest("GET", "http://example.com", nil)
if err != nil {
panic(err)
}
// 发送请求
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
// 读取并打印请求
requestDump, err := httputil.DumpRequest(req, true)
if err != nil {
panic(err)
}
fmt.Println("请求:")
fmt.Println(string(requestDump))
// 读取并打印响应
responseDump, err := httputil.DumpResponse(resp, true)
if err != nil {
panic(err)
}
fmt.Println("响应:")
fmt.Println(string(responseDump))
}
在这个示例中,我们创建了一个HTTP GET请求,然后发送这个请求到 "http://example.com"。之后,我们使用 DumpRequest
和 DumpResponse
函数分别打印了请求和响应的详细信息。
注意,DumpRequest
和 DumpResponse
函数读取请求或响应的所有数据,因此在调用这些函数之后,原始的 resp.Body
或 req.Body
的数据读取器已经被消耗了。如果你想在调用这些函数之后还能多次读取原始的响应体,你需要先将响应体的内容读取到一个字节切片中,然后再创建响应对象。例如:
respBodyBytes, err := ioutil.ReadAll(resp.Body)
if err != nil {
panic(err)
}
defer resp.Body.Close()
buf := bytes.NewBuffer(respBodyBytes)
resp.Body = ioutil.NopCloser(buf)
// 现在可以安全地使用 DumpResponse
responseDump, err := httputil.DumpResponse(resp, true)
if err != nil {
panic(err)
}
fmt.Println("响应:")
fmt.Println(string(responseDump))
这样,即使调用了 DumpResponse
,原始的响应体也仍然可以被多次读取。
评论已关闭