我一直在我的 Go 应用程序中使用GoRequest作为一个包。
我使用它是因为它有助于使我需要的所有 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 个请求。
我已经分叉了 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
}
但是,在尝试构建它时出现错误:
不能使用 newRateLimitTransport(limit, http.DefaultTransport) (type http.RoundTripper) 作为 type *http.Transport in assignment: 需要类型断言
我已经看了好几个小时了,我不太明白这对普通人来说是如何工作的,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
}