美文网首页
Go 学习笔记1 - 通过http包发送网络请求

Go 学习笔记1 - 通过http包发送网络请求

作者: 张云飞Vir | 来源:发表于2020-03-13 10:20 被阅读0次

概述

http 包 提供了 HTTP 客户端实现,和服务端的实现。
通过 http 包,我们可以发送网络请求,get, post 等。

发送 Get,Post,Head

构建 get , 方法,很简单,示例:

resp, err := http.Get("http://example.com/")
...
resp, err := http.PostForm("http://example.com/form",
    url.Values{"key": {"Value"}, "id": {"123"}})
...

上传图片

resp, err := http.Post("h ttp://example.com/upload", "image/jpeg", &buf)

在使用完毕后,记得一定要关闭,像下面这样:

resp, err := http.Get("http://example.com/")
if err != nil {
    // handle error
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
// ...

控制 http客户端 的一些 header, 转发策略等其他设置,我们通过创一个 Client 来实现:

client := &http.Client{
    CheckRedirect: redirectPolicyFunc,
}

resp, err := client.Get("http://example.com")
// ...

req, err := http.NewRequest("GET", "http://example.com", nil)
// ...
req.Header.Add("If-None-Match", `W/"wyzzy"`)
resp, err := client.Do(req)
// ...

控制代理的行为,TLS配置, 长连接,keep-alives,压缩,和其他配置,要创建一个 Transport,示例:

tr := &http.Transport{
    TLSClientConfig:    &tls.Config{RootCAs: pool},
    DisableCompression: true,
}
client := &http.Client{Transport: tr}
resp, err := client.Get("https://example.com")

Clients 和 Transports 是通过 go程 的安全并发实现,高效一点的方法是:创建一个,多次重用它。

一个完整的get示例

package main

import (
  "fmt"
  "net/http"
  "io/ioutil"
)

func demoGet(){
  resp,err := http.Get("http://www.baidu.com")
  defer resp.Body.Close()
  if err != nil {
    fmt.Println("ERROR: ",err);
    return
  }
  fmt.Println(resp);

  body,_ := ioutil.ReadAll(resp.Body)
  fmt.Print(string(body))

}

func main() {
  demoGet()
}

配置访问代理

在开发过程中,有时候需要抓包来帮助诊断网络请求和响应,Charles是一个在Mac下非常方便的抓包工具,它会在本机开启一个代理服务来捕获网络请求包。分解后的过程:

1.启动 Charles,它会开始监听 127.0.0.1 的8888端口
2.编写的Go程序,配置访问代理,代理指向 127.0.0.1 的8888端口
3.启动Go程序,发出的HTTP包就会经过代理,会被 Charles 捕获到。

那么,如何配置Go程序发送请求时指定访问代理呢,代码如下:

proxy := func(_ *http.Request) (*url.URL, error) {
    return url.Parse("http://127.0.0.1:8888")
}
transport := &http.Transport{Proxy: proxy}
client := &http.Client{Transport: transport}
resp, err := client.Post(url1, "text/plain",   strings.NewReader(requestBody))

END

相关文章

网友评论

      本文标题:Go 学习笔记1 - 通过http包发送网络请求

      本文链接:https://www.haomeiwen.com/subject/yibwjhtx.html