我正在尝试编写一个 Twitter 阅读器来解析链接缩短器等的最终 URL,但同时为我提供了手动定义的主机模式列表的 URL。这样做的原因是我不想最终得到付费墙 URL,而是之前的 URL。
据我所知,执行此操作的方法是根据默认的 RoundTripper 编写自己的客户端,因为从自定义的 CheckRedirect 函数返回错误会中止客户端没有产生响应。
有没有办法使用默认的客户端
并通过自定义checkRedirect
函数记录URL/特定URL列表?
最佳答案
如果您的自定义 CheckResponse
产生错误,客户端请求实际上仍然会返回最后一个有效的 Response
(如评论中所述) )。
http://golang.org/pkg/net/http/#Client
If CheckRedirect returns an error, the Client's Get method returns both the previous Response and CheckRedirect's error (wrapped in a url.Error) instead of issuing the Request req.
如果您维护“已知”付费墙网址列表,则可以使用自定义错误
类型(Paywalled
在下面的示例中)。
您的错误处理代码稍后必须将该错误类型视为特殊(非错误)情况。
示例:
package main
import (
"errors"
"fmt"
"net/http"
"net/url"
)
var Paywalled = errors.New("next redirect would hit a paywall")
var badHosts = map[string]error{
"registration.ft.com": Paywalled,
}
var client = &http.Client{
CheckRedirect: func(req *http.Request, via []*http.Request) error {
// N.B.: when used in production, also check for redirect loops
return badHosts[req.URL.Host]
},
}
func main() {
resp, err := client.Get("http://on.ft.com/14pQBYE")
// ignore non-nil err if it's a `Paywalled` wrapped in url.Error
if e, ok := err.(*url.Error); (ok && e.Err != Paywalled) || (!ok && err != nil) {
fmt.Println("error: ", err)
return
}
resp.Body.Close()
fmt.Println(resp.Request.URL)
}
关于go - 在 Go 中选择性地遵循重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27814942/