go - 在 Go 中选择性地遵循重定向

标签 go

我正在尝试编写一个 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/

相关文章:

golang-grpc 服务 - 从另一个文件导入类型

sql - 我应该将常见的 SQL 查询或 CTE 分开并放在一个变量中吗?

Golang 并发写入变量 - 为什么这段代码有效?

groovy - Groovy-和Go gvm共存

go - 如何更改GO文件的默认输出文件夹路径?

api - 未在Vue页面上检测到Cookie

string - 如何定义自定义字母顺序以在 go 中比较和排序字符串?

Go 包与 go dep 的依赖关系

url - 使用 net/url 内置包解析带有矩阵参数的 URL

testing - 测试中的静态文件