net/http包提供了HTTP客户端和服务端的实现。

Get、Head、Post和PostForm函数发出HTTP/ HTTPS请求。

HTTP协议

超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络传输协议,所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。

Get

func main() {
    resp, err := http.Get("https://baidu.com")
    if err != nil {
        fmt.Printf("Get err: %v", err)
        return
    }
    // 使用完关闭response回复主体
    defer resp.Body.Close()

    var tmp = make([]byte, 1024)
    tmp, err = ioutil.ReadAll(resp.Body)
    if err != nil {
        fmt.Printf("ReadAll resp.Body failed err: %v\n", err)
        return
    }
    fmt.Println(string(tmp))
}

Get带参数不放在url里面

func main() {
    params := url.Values{}
    params.Set("name", "ok")
    params.Set("age", "18")
    url, _ := url.Parse("http:127.0.0.1:8080")
    url.RawQuery = params.Encode()
    urlParse := url.String()
    fmt.Println(urlParse)
    // 输出 http:127.0.0.1:8080?age=18&name=ok
}

Post

func main() {
    urlValues := url.Values{}
    urlValues.Add("name", "ok")
    urlValues.Add("age", "18")
    resp, _ := http.PostForm("http://127.0.0.1",urlValues)
    defer resp.Body.Close()
    body, _ := ioutil.ReadAll(resp.Body)
    fmt.Println(string(body))
}

另一种写法

func main() {
    urlValues := url.Values{
        "name":{"ok"},
        "age":{"18"},
    }
    reqBody:= urlValues.Encode()
    resp, _ := http.Post("http://www.xxx.com/post", "text/html",strings.NewReader(reqBody))
    defer resp.Body.close()
    body,_:= ioutil.ReadAll(resp.Body)
    fmt.Println(string(body))
}

添加请求头

通过添加请求头访问手机版百度

func main() {
   request, err := http.NewRequest(http.MethodGet, "https://baidu.com", nil)
   request.Header.Add("User-Agent", "Mozilla/5.0 (Linux; Android 8.0; Pixel 2 Build/OPD3.170816.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.80 Mobile Safari/537.36")
   if err != nil {
      fmt.Printf("NewRequest failed err: %v\n", err)
      return
   }
   resp, err2 := http.DefaultClient.Do(request)
   if err2 != nil {
      fmt.Printf("NewRequest failed err2: %v\n", err2)
      return
   }
   defer resp.Body.Close()
   s, _ := httputil.DumpResponse(resp, true)
   fmt.Printf("%s\n", s)
}