首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用http.Client和http.Transport为请求设置头

使用http.Client和http.Transport为请求设置头
EN

Stack Overflow用户
提问于 2015-09-12 14:59:00
回答 1查看 5.6K关注 0票数 3

我有不止一个ip可以上网。我正在请求选择界面。在这种情况下,我应该如何设置标题?

代码语言:javascript
复制
tcpAddr := &net.TCPAddr{
    IP: addrs[3].(*net.IPNet).IP, // Choosing ip address number 3
}
d := net.Dialer{LocalAddr: tcpAddr}
conn, err2 := d.Dial("tcp", "www.whatismyip.com:80")
if err2 != nil {
    log.Fatal(err2)
}

defer conn.Close()

transport := &http.Transport{
    Proxy:               http.ProxyFromEnvironment,
    Dial:                (&net.Dialer{LocalAddr: tcpAddr}).Dial,
    TLSHandshakeTimeout: 10 * time.Second,
}

client := &http.Client{
    Transport: transport,
}

response, err := client.Get("https://www.whatismyip.com/")

通常在此way中设置头:

代码语言:javascript
复制
req.Header.Set("name", "value")

但不知道如何将它们设置为我的代码。

我想它们一定是在http.Transporthttp.Client的某个地方设置的。但到底是怎么回事?

我的完整代码:

代码语言:javascript
复制
package main

import (
    "bytes"
    "fmt"
    "github.com/PuerkitoBio/goquery"
    "io/ioutil"
    "log"
    "net"
    "net/http"
    "os"
    "time"
)

func main() {
    ief, err := net.InterfaceByName("eth0")
    if err != nil {
        log.Fatal(err)
    }
    addrs, err := ief.Addrs()
    if err != nil {
        log.Fatal(err)
    }
    tcpAddr := &net.TCPAddr{
        IP: addrs[3].(*net.IPNet).IP, // Choosing ip address number 3
    }
    d := net.Dialer{LocalAddr: tcpAddr}
    conn, err2 := d.Dial("tcp", "www.whatismyip.com:80")
    if err2 != nil {
        log.Fatal(err2)
    }

    defer conn.Close()

    transport := &http.Transport{
        Proxy:               http.ProxyFromEnvironment,
        Dial:                (&net.Dialer{LocalAddr: tcpAddr}).Dial,
        TLSHandshakeTimeout: 10 * time.Second,
    }

    client := &http.Client{
        Transport: transport,
    }

    response, err := client.Get("https://www.whatismyip.com/")

    if err != nil {
        fmt.Printf("%s", err)
        os.Exit(1)
    } else {
        defer response.Body.Close()
        contents, err := ioutil.ReadAll(response.Body)
        if err != nil {
            fmt.Printf("%s", err)
            os.Exit(1)
        }
        var contentsStr = string(contents)
        fmt.Printf("%s\n", contentsStr)
        var doc = DocByHtmlString(contentsStr)

        doc.Find("div").Each(func(i int, s *goquery.Selection) {
            attr, exists := s.Attr("class")
            if exists {
                if attr == "ip" {
                    fmt.Println(s.Text())
                }
            }
        })
    }
}

func DocByHtmlString(html string) *goquery.Document {
    doc, err := goquery.NewDocumentFromReader(bytes.NewBufferString(html))
    if err != nil {
        panic(err)
    }
    return doc
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-12 15:12:31

创建请求:

代码语言:javascript
复制
 req, err := http.NewRequest("GET", "https://www.whatismyip.com/", nil)
 if err != nil {
  // handle error
 }

设置标题:

代码语言:javascript
复制
 req.Header.Set("name", "value")

使用问题中配置的client运行请求:

代码语言:javascript
复制
 resp, err := client.Do(req)
 if err != nil {
     // handle error
 }

如问题中所示,处理响应。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32540219

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档