我正在尝试编写一个解析链接缩短程序的最终URL等的推特阅读器,但是为了获得手动定义的主机模式列表,我还提供了一个URL。这样做的原因是我不希望最终得到付费专区网址,而是之前的那个。
据我所知,这是基于默认的RoundTripper
编写我自己的客户端,因为从自定义CheckRedirect
函数返回错误会中止客户端而不会产生响应。< / p>
有没有办法使用默认client
并记录自定义checkRedirect
函数中的网址/特定网址列表?
答案 0 :(得分:3)
如果您的自定义Response
产生错误(如评论中所述),客户端请求 实际上仍会返回上一个有效CheckResponse
。
http://golang.org/pkg/net/http/#Client
如果CheckRedirect返回错误,则客户端的Get方法返回先前的Response和CheckRedirect的错误(包含在url.Error中),而不是发出Request req。
如果您维护“已知”付费专区网址列表,则可以使用自定义CheckResponse
类型(error
类型中的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)
}
) 。
您的错误处理代码稍后必须将该错误类型视为特殊(非错误)情况。
示例:
{{1}}