当前位置: 首页 > 面试题库 >

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

周和安
2023-03-14
问题内容

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

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/")

通常,头是以这种方式设置的:

req.Header.Set("name", "value")

但是无法弄清楚如何将它们设置为我的代码。

我想它们必须放在http.Transport或中的某个位置http.Client。但是到底如何呢?

我的完整代码:

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
}

问题答案:

创建一个请求:

 req, err := http.NewRequest("GET", "https://www.whatismyip.com/", nil)
 if err != nil {
  // handle error
 }

设置标题:

 req.Header.Set("name", "value")

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

 resp, err := client.Do(req)
 if err != nil {
     // handle error
 }

按照问题所示处理响应。



 类似资料:
  • 问题内容: 使用PHP,是否可以使用发送HTTP标头? 我知道您可以从文件中发送用户代理。但是,你能不能也发送其他信息,如,和用? 还是有另一个功能可以完成此任务? 问题答案: 实际上,在进一步阅读该功能后: 您也许可以遵循这种模式来实现您想要的目标,但是我还没有亲自测试过。(如果它不起作用,请随时查看我的其他答案)

  • 问题内容: 在使用XMLHttpRequest进行AJAX调用时,似乎无法从JavaScript更改大多数请求标头。请注意,必须在Gecko浏览器中调用when。设置_Referer时_ ,它没有设置(我查看了使用Firebug和Tamper Data发送的请求标头)。当我设置User-Agent时,它完全搞砸了AJAX调用。但是,设置接受和_内容类型_确实可以。我们是否无法在Firefox 3中

  • 问题内容: 我一直在努力解决这个问题几天。根据CORS请求设置Cookie。我看到了相互矛盾的文章和答案,有人说,只要XHR请求设置为true,并且服务器发送适当的标头,浏览器就应该尊重标头。但是,在我的测试中情况并非如此。 示例代码: index.js(Node.js服务器) cookies.html 我已经尝试在Firefox Developer Edition和Chrome上对此进行测试,除

  • 我正在使用feign创建一个REST客户端。我有我的电话工作,但我想添加一些超时支持,我有一段时间,弄清楚如何做到这一点。 Feign的文档中说:“要将Hystrix与Feign一起使用,请将Hystrix模块添加到类路径中,然后使用HystrixFeign构建器。”好了,现在我有了这个: 现在我的所有方法都在返回HystrixCommands,我可以执行或排队,但仍然看不到如何配置它们。 但是我

  • 问题内容: 我的应用程序中有一个需要基本身份验证的特定请求,因此我需要为该请求设置Authorization标头。我读过有关设置HTTP请求标头的信息,但据我所知,它将为该方法的所有请求设置标头。我的代码中有这样的内容: 但我不希望我的每一个帖子请求都发送此标头。有什么方法可以仅为我想要的一个请求发送标头吗?还是我必须在请求后将其删除? 问题答案: 传递给每次调用标头的config对象中有一个标头

  • 我的后端是sprin引导应用程序,前端是vue js 但是cookie值没有设置在请求头部和所有其他api失败与身份验证问题,因为cookie值(会话ID)不存在于头部 样本响应头部与set-cookie身份验证 下面是我在vue.config.js中的代理配置 这是我的axios实例创建与"with凭据:真" 下面是我在服务器端的web安全配置 注意:这在邮递员中工作,因为邮递员会自动将cook