一尘不染

在Go中查询网址而无需重定向

go

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

我希望程序查询某些重定向到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 field以恒定的性能工作。我不确定它是否重用连接还是为每个请求打开一个新连接。我client为循环中的每个请求创建一个。这就是它在现实生活中的行为方式(每个请求都是一个新的连接)。有没有办法确保每个查询后关闭连接并且不重新使用连接?

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


阅读 220

收藏
2020-07-02

共1个答案

一尘不染

为了完整起见,您 可以
使用http.Client和不遵循重定向。http.Client具有CheckRedirect这是一个功能。在进行任何重定向之前都将调用它。

如果此函数返回错误,httpClient.Do(...)则将
遵循重定向(请参见doFollowingRedirects()Go的源代码中的函数),而将返回错误(其具体类型为url.Error,并且其URL字段将为重定向到URL,也就是Location标头值)
请参见此代码)。

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

2020-07-02