# HTTP

Go 语言面向服务的,网络的,并发的,所以 Go 对 Http 封装是很好的。

  1. 实现一个简单的 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)
}
  1. 如果修改 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)
}
  1. 使用 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)
}

  1. 使用 http 服务器进行性能分析
  • import _ "net/http/ppof"

  • 访问 /debug/ppof

  • 使用 go tool pprof 分析性能