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

Max*_*Max 10 redirect go

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

我查看我的程序来查询重定向到AppStore的某些URL.但我不想下载AppStore页面.我只想记录重定向URL或错误.

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


UPDATE

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

我试过两种解决方案.我在做基准测试.我运行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.
Run Code Online (Sandbox Code Playgroud)

我猜它重新使用已关闭的连接.

  • 第二种解决方案:CheckRedirect field具有持续性能.我不确定它是否重新使用连接,或者为每个请求打开一个新连接.我client为循环中的每个请求创建.它是如何在现实生活中表现的(每个请求都是一个新的连接).有没有办法确保在每次查询后关闭连接而不重用?

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

and*_*olm 20

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

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


mna*_*mna 14

为了完整起见,您可以使用http.Client而不是按照重定向.http.Client有一个功能的CheckRedirect领域.在执行任何重定向之前调用它.

如果这个函数返回一个错误,那么httpClient.Do(...)不会跟随重定向(见doFollowingRedirects()围棋的源代码功能),而是会返回一个错误(其具体类型将是url.Error,它的URL领域将是重定向到URL,又名Location头值,看到这段代码).

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