我目前正在Go中编写一些与REST API交互的软件.我正在尝试查询的REST API端点返回HTTP 302重定向以及指向资源URI的HTTP Location标头.
我正在尝试使用Go脚本来获取HTTP Location标头以供以后处理.
以下是我目前正在实现的功能:
package main
import (
"errors"
"fmt"
"io/ioutil"
"net/http"
)
var BASE_URL = "https://api.stormpath.com/v1"
var STORMPATH_API_KEY_ID = "xxx"
var STORMPATH_API_KEY_SECRET = "xxx"
func noRedirect(req *http.Request, via []*http.Request) error {
return errors.New("Don't redirect!")
}
func main() {
client := &http.Client{
CheckRedirect: noRedirect
}
req, err := http.NewRequest("GET", BASE_URL+"/tenants/current", nil)
req.SetBasicAuth(STORMPATH_API_KEY_ID, STORMPATH_API_KEY_SECRET)
resp, err := client.Do(req)
// If we get here, it means one of two things: either this http request
// actually failed, or …Run Code Online (Sandbox Code Playgroud) 我正在为重定向脚本编写基准测试.
我查看我的程序来查询重定向到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为循环中的每个请求创建.它是如何在现实生活中表现的(每个请求都是一个新的连接).有没有办法确保在每次查询后关闭连接而不重用?这就是为什么我要将第二个解决方案标记为回答我的问题.但是对于我的研究,每个查询都是一个新连接是非常重要的.如何确保第二种解决方案?