Redirect Go中无重定向的查询URL

Redirect Go中无重定向的查询URL,redirect,go,Redirect,Go,我正在为重定向脚本编写一个基准测试 我希望我的程序能够查询重定向到AppStore的特定URL。但我不想下载AppStore页面。我只想记录重定向URL或错误 在没有第二次重定向查询的情况下,我如何告知转到查询URL 更新 两个答案都是正确的,但: 我尝试了两种解决方案。我在做基准测试。 我用10-500个go例程运行1个或多个go进程。它们在一个循环中查询URL。 我的服务器也是用go编写的。它每秒报告请求数 第一种解决方案:http.DefaultTransport.RoundTrip-

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

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

在没有第二次重定向查询的情况下,我如何告知转到查询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字段
    可以保持恒定的性能。我不确定它是重新使用连接还是为每个请求打开一个新连接。我为循环中的每个请求创建
    client
    。这是它在现实生活中的表现(每个请求都是一个新的连接)。有没有办法确保每次查询后都关闭连接,并且不会重复使用

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

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

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

为了完整起见,您可以使用
http.Client
,而不遵循重定向<代码>http。客户端具有一个函数。在执行任何重定向之前调用它

如果此函数返回错误,则
httpClient.Do(…)
将不遵循重定向(请参阅),而是返回错误(其具体类型将是
url.error
,其
url
字段将是重定向到url,也称为位置头值,)


有关此用法的具体示例,请参见my。

谢谢。是否有必要确保在每次请求后关闭连接?我希望模拟来自社交网络的巨大流量,这些流量必须根据代理头在1-5分钟内重新定向。因此,每个用户只查询一次,并且必须重定向。(即连接必须关闭)我不确定是否会为负载测试/基准测试工具创建自定义客户端。我建议使用ApacheBench(ab,)之类的工具。我知道ab。但我希望更好地了解Go网络。这样一个琐碎的案例会引发很多问题。谢谢