【问题标题】:Query URL without redirect in Go在 Go 中查询没有重定向的 URL
【发布时间】:2013-01-19 23:55:02
【问题描述】:

我正在为重定向脚本编写基准测试。

我希望我的程序查询重定向到 AppStore 的特定 URL。但我不想下载 AppStore 页面。我只想记录重定向 URL 或错误。

如何在没有第二次重定向查询的情况下告诉 Go to query URL?


更新

两个答案都是正确的,但是:

我尝试了这两种解决方案。我正在做基准测试。 我使用 10 - 500 个 go 例程运行 1 个或多个 go 进程。他们循环查询 URL。 我的服务器也是用 go 写的。它每秒报告请求数。

  • 第一个解决方案:http.DefaultTransport.RoundTrip - 运行缓慢,出现错误。 前 4 秒工作正常。进行 300-500 次查询然后性能下降到每秒 80 次查询。

然后下降到每秒 0-5 个查询,并且 queryies 脚本开始出现类似的错误

dial tcp IP:80: A connection attempt failed because the connected 
party did not properly respond after a period of time, or established 
connection failed because connected host has failed to respond.

我猜它会重用已关闭的连接。

  • 第二种解决方案:CheckRedirect field 以恒定的性能工作。我不确定它是重复使用连接还是为每个请求打开一个新连接。我为循环中的每个请求创建client。这就是它在现实生活中的行为方式(每个请求都是一个新连接)。有没有办法确保在每次查询后关闭连接并且不再重复使用?

这就是为什么我要标记第二个解决方案来回答我的问题。但是对于我的研究来说,每个查询都是一个新的连接是非常重要的。如何确保第二个解决方案?

【问题讨论】:

    标签: redirect go


    【解决方案1】:

    您需要使用 http.Transport 而不是 http.Client。传输是较低级别的,不遵循重定向。

    req, err := http.NewRequest("GET", "http://example.com/redirectToAppStore", nil)
    // ...
    resp, err := http.DefaultTransport.RoundTrip(req)
    

    【讨论】:

      【解决方案2】:

      为了完整起见,您可以使用http.Client 而不遵循重定向。 http.Client 有一个 CheckRedirect field 这是一个函数。在进行任何重定向之前调用它。

      如果这个函数返回一个错误,那么httpClient.Do(...)跟随重定向(参见doFollowingRedirects() function in Go's source code)而是返回一个错误(它的具体类型是url.Error,它的URL 字段将是重定向到 URL,也就是 Location 标头值,see this code)。

      您可以查看我的gocrawl library 以了解此用法的具体示例。

      【讨论】:

      • 谢谢。是否确保在每次请求后关闭连接?我希望模拟来自社交网络的巨大流量,必须根据代理标头在 1-5 分钟内重新定向。所以每个用户只查询一次并且必须被重定向。 (即连接必须关闭)
      • 我不确定我是否会为负载测试/基准测试工具创建自定义客户端。我建议使用 Apache Bench (ab, httpd.apache.org/docs/2.2/programs/ab.html) 之类的东西。
      • 我知道。但我想更好地了解 Go 网络。如此琐碎的案例课程如此多的问题。谢谢
      猜你喜欢
      • 2015-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-20
      • 1970-01-01
      • 2014-07-08
      • 2019-06-17
      相关资源
      最近更新 更多