前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何用Golang模拟客户端发送Http请求

如何用Golang模拟客户端发送Http请求

作者头像
陌无崖
发布2019-08-16 17:58:20
7.7K0
发布2019-08-16 17:58:20
举报

导语

在Golang中web开发中net/http是经常用到的包,在这个包中包含了各种请求与响应的方式,下面我会一一进行介绍。

Get请求

不带参数的Get请求

在这个例子中直接使用http.Get()函数,返回一个*http.Response类型的变量,ioutil.ReadAll(resp.Body)将会读取响应后的内容。

代码语言:javascript
复制
func SendSimpleGetRequest() {
    resp, err := http.Get("https://baidu.com")
    if err != nil {
        panic(err)

    }
    defer resp.Body.Close()
    s, err := ioutil.ReadAll(resp.Body)
    fmt.Printf(string(s))
}

携带参数的Get请求

这个例子中使用url.Values{}返回一个map[string][]string类型,用来存放我们的参数,当然也可以直接在url地址中直接携带,但一般不推荐这么使用,params.Encode()将会对我们的中文进行编码,防止数据传输过程中出错。

代码语言:javascript
复制
func SendComplexGetRequest() {
    params := url.Values{}

    Url, err := url.Parse("http://baidu.com?fd=fdsf")
    if err != nil {
        panic(err.Error())

    }
    params.Set("a", "fdfds")
    params.Set("id", string("1"))
    //如果参数中有中文参数,这个方法会进行URLEncode
    Url.RawQuery = params.Encode()
    urlPath := Url.String()
    resp, err := http.Get(urlPath)
    defer resp.Body.Close()
    s, err := ioutil.ReadAll(resp.Body)
    fmt.Println(string(s))
}

Post请求

一般post请求的参数不会直接在url地址中被看到,同样我们也使用相同的方式追加参数。如下

代码语言:javascript
复制
func httpPostForm() {
    // params:=url.Values{}
    // params.Set("hello","fdsfs")  //这两种都可以
    params := url.Values{"key": {"Value"}, "id": {"123"}}
    resp, _ := http.PostForm("http://baidu.com", params)

    defer resp.Body.Close()
    body, _ := ioutil.ReadAll(resp.Body)

    fmt.Println(string(body))

}

客户端通用模式

那可能会有小伙伴问,这么多方式该怎么记得住,其实在发送请求时还有一个通用的思路,就是使用客户端,在Golang中我们可以自定义自己的http请求客户端,让它为我们发送http请求。下面的函数中我们同样使用url.Values{}存放我们的参数,使用http.Client{}实例化一个客户端,使用http.NewRequest()新创建一个请求,注意里面的参数全部是自己设置的,当然我们也可以设置成GET方式。req.Header.Set()设置头,最后使用client.Do(req)就可以发送请求了。

代码语言:javascript
复制
func httpDo() {
    client := &http.Client{}

    urlmap := url.Values{}

    urlmap.Add("client_id", "esss")
    urlmap.Add("client_secret", "sk")
    parms := ioutil.NopCloser(strings.NewReader(urlmap.Encode())) //把form数据编下码
    req, err := http.NewRequest("POST", "www.baidu.com", parms)
    if err != nil {
        // handle error
    }

    req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
    req.Header.Set("Cookie", "name=anny")

    resp, err := client.Do(req)

    defer resp.Body.Close()

    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        // handle error
    }

    fmt.Println(string(body))
}

END

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-08-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 golang技术杂文 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Get请求
    • 不带参数的Get请求
      • 携带参数的Get请求
      • Post请求
      • 客户端通用模式
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档