gpt4 book ai didi

go - 更改 *http.Client 传输

转载 作者:IT王子 更新时间:2023-10-29 01:01:38 29 4
gpt4 key购买 nike

现状

在选择了一个辅助项目(围绕第三方 API 构建包装器)之后,我陷入了困境。我正在使用 sling编写我的 HTTP 请求。

所以Client的部分组成如下:

type Client struct {
// some services etc..
sling *sling.Sling <-- this is initialized with *http.Client
}

func NewClient(httpClient *http.Client) *Client {
sling := sling.New().Client(httpClient).Base(BaseURL)
}

//....

我无法理解的事情

我遵循与 go-github 相同的原则和 go-twitter该身份验证不应由我的库处理,而应由 golang 的 oauth1/2 包处理。

由于 API 提供应用程序和用户级别的身份验证,一些工作流需要初始应用程序级别身份验证,然后是用户级别身份验证,我的问题是,是否有任何方法可以更改 *http.Transport 以便在客户端更改身份验证 header 。

到目前为止,我还没有找到这样做的方法。

最佳答案

http.Client 有一个 Transport 字段,如果您需要的话,您可以使用它来“根据客户端更改身份验证 header ”。 Transport 字段的类型为 http.RoundTripper,它是一个方法接口(interface),因此您需要做的就是使用 RoundTrip< 的实现来定义您的传输 方法。

type MyTransport struct {
apiKey string
// keep a reference to the client's original transport
rt http.RoundTripper
}

func (t *MyTransport) RoundTrip(r *http.Request) (*http.Response, error) {
// set your auth headers here
r.Header.Set("Auth", t.apiKey)
return t.rt.RoundTrip(r)
}

现在您可以使用此类型的实例来设置 http.Client 上的 Transport 字段。

var client *http.Client = // get client from somewhere...
// set the transport to your type
client.Transport = &MyTransport{apiKey: "secret", tr: client.Transport}

根据您获取客户端的方式和位置,它的 Transport 字段可能尚未设置,因此最好确保您的类型在此类情况下使用默认传输一个案例。

func (t *MyTransport) transport() http.RoundTripper {
if t.rt != nil {
return t.rt
}
return http.DefaultTransport
}

// update your method accordingly
func (t *MyTransport) RoundTrip(r *http.Request) (*http.Response, error) {
// set your auth headers here
r.Header.Set("Auth", t.apiKey)
return t.transport().RoundTrip(r)
}

可能值得注意的是 Go documentation建议不要修改RoundTrip 方法里面的*http.Request,这样可以做什么,go-github您链接到的包正在做的是创建请求的副本,在其上设置身份验证 header ,并将其传递给底层 Transport。看这里:https://github.com/google/go-github/blob/d23570d44313ca73dbcaadec71fc43eca4d29f8b/github/github.go#L841-L875

关于go - 更改 *http.Client 传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43447405/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com