# HTTP
Go 语言面向服务的,网络的,并发的,所以 Go 对 Http 封装是很好的。
- 实现一个简单的 http client
package main
import (
"fmt"
"net/http"
"net/http/httputil"
)
func main() {
resp, err := http.Get("http://www.baidu.com")
if err != nil {
panic(err)
}
defer resp.Body.Close()
// 获取 http 的 response
s, err := httputil.DumpResponse(resp, true)
if err != nil {
panic(err)
}
fmt.Printf("%s\n", s)
}
- 如果修改 header 头部的 User-Agent 字段,模拟手机请求。
...
func main() {
request, err := http.NewRequest(
http.MethodGet,
"http://www.baidu.com",
nil,
)
if err != nil {
panic(err)
}
request.Header.Add("User-Agent", "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1")
resp, err := http.DefaultClient.Do(request)
// resp, err := http.Get("http://www.baidu.com")
if err != nil {
panic(err)
}
defer resp.Body.Close()
// 打印所有的 response
s, err := httputil.DumpResponse(resp, true)
if err != nil {
panic(err)
}
fmt.Printf("%s\n", s)
}
- 使用 http.Client 控制请求头部等
...
func main() {
request, err := http.NewRequest(
http.MethodGet,
"http://www.baidu.com",
nil,
)
if err != nil {
panic(err)
}
client := http.Client{
CheckRedirect: func(
// 目标放在 request
req *http.Request,
// 所有重定向的路径放在 via 里面
via []*http.Request) error {
fmt.Println("Redirect:", req)
return nil
},
}
resp, err := client.Do(request)
// resp, err := http.Get("http://www.baidu.com")
if err != nil {
panic(err)
}
defer resp.Body.Close()
s, err := httputil.DumpResponse(resp, true)
if err != nil {
panic(err)
}
fmt.Printf("%s\n", s)
}
- 使用 http 服务器进行性能分析
import _ "net/http/ppof"
访问 /debug/ppof
使用 go tool pprof 分析性能