在Go中没有重定向的查询URL

时间:2013-01-19 23:55:02

标签: redirect go

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

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

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


更新

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

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

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

然后每秒下降到0-5查询,查询脚本开始出现错误,如

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。它是如何在现实生活中表现的(每个请求都是一个新的连接)。有没有办法确保在每次查询后关闭连接而不重复使用?

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

2 个答案:

答案 0 :(得分:19)

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

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

答案 1 :(得分:14)

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

如果此函数返回错误,则httpClient.Do(...)跟随重定向(请参阅doFollowingRedirects() function in Go's source code),而是返回错误(其具体类型为{{ 1}},其url.Error字段将是重定向到的网址,也就是位置标头值see this code)。

您可以查看我的gocrawl library以获取此用途的具体示例。