gpt4 book ai didi

http - 将自定义传输添加到第三方包

转载 作者:数据小太阳 更新时间:2023-10-29 03:23:31 25 4
gpt4 key购买 nike

我一直在使用GoRequest作为我的 Go 应用程序中的一个包。

我使用它是因为它有助于使我需要的所有 API 调用变得更加清晰 - 它缺少的一件事是我能够使用常规 http.Client 实现Transport 的出站速率限制。

例如,在我的一个应用程序中我使用这个 -

type rateLimitTransport struct {
limiter *rate.Limiter
xport http.RoundTripper
}

var _ http.RoundTripper = &rateLimitTransport{}

func newRateLimitTransport(r float64, xport http.RoundTripper) http.RoundTripper {
return &rateLimitTransport{
limiter: rate.NewLimiter(rate.Limit(r), 1),
xport: xport,
}
}

func (t *rateLimitTransport) RoundTrip(r *http.Request) (*http.Response, error) {
t.limiter.Wait(r.Context())
return t.xport.RoundTrip(r)
}

var myClient = http.Client{
// Use a rate-limiting transport which falls back to the default
Transport: newRateLimitTransport(1, http.DefaultTransport),
}

这允许我创建一个客户端,速率限制为每秒 1 个请求;每分钟 60 个请求。

我已经 fork 了 GoRequest 包,并尝试向其中添加一个名为 SetRateLimit() 的新方法,该方法应将每秒速率作为参数并使用它来实现速率受限的传输。

到目前为止,我的尝试是这样的:

import (
//...current imports
"golang.org/x/time/rate"
)
//... Rest of the package
type rateLimitTransport struct {
limiter *rate.Limiter
xport http.RoundTripper
}

var _ http.RoundTripper = &rateLimitTransport{}

func newRateLimitTransport(r float64, xport http.RoundTripper) http.RoundTripper {
return &rateLimitTransport{
limiter: rate.NewLimiter(rate.Limit(r), 1),
xport: xport,
}
}

func (t *rateLimitTransport) RoundTrip(r *http.Request) (*http.Response, error) {
t.limiter.Wait(r.Context())
return t.xport.RoundTrip(r)
}

func (s *SuperAgent) SetRateLimit(limit float64) *SuperAgent {

s.Transport = newRateLimitTransport(limit, http.DefaultTransport)
return s
}

但是我在尝试构建它时遇到错误:

cannot use newRateLimitTransport(limit, http.DefaultTransport) (type http.RoundTripper) as type *http.Transport in assignment: need type assertion

我已经看了好几个小时了,我不太明白这对常规 http.Client 是如何工作的,但对这个包不起作用。

有人可以帮我解决上述问题并为这个包添加速率限制吗?

更新 - SuperRequest 结构

// A SuperAgent is a object storing all request data for client.
type SuperAgent struct {
Url string
Method string
Header http.Header
TargetType string
ForceType string
Data map[string]interface{}
SliceData []interface{}
FormData url.Values
QueryData url.Values
FileData []File
BounceToRawString bool
RawString string
Client *http.Client
Transport *http.Transport
Cookies []*http.Cookie
Errors []error
BasicAuth struct{ Username, Password string }
Debug bool
CurlCommand bool
logger Logger
Retryable struct {
RetryableStatus []int
RetryerTime time.Duration
RetryerCount int
Attempt int
Enable bool
}
//If true prevents clearing Superagent data and makes it possible to reuse it for the next requests
DoNotClearSuperAgent bool
}

最佳答案

您看到的错误说明了问题所在。

cannot use newRateLimitTransport(limit, http.DefaultTransport) (type http.RoundTripper) as type *http.Transport in assignment: need type assertion

SuperAgent.Transport 类型是 *http.Transport 但您正在尝试将 http.RoundTripper 分配给该字段

要解决此问题,您可以更改 SuperaAgent

type SuperAgent{
...
Transport http.RoundTripper
...
}

关于http - 将自定义传输添加到第三方包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48757894/

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