我在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)(类型为http.RoundTripper)作为类型* http.Transport:need type assertion
我已经看了好几个小时了,我不太明白这对于常规http.Client
是如何工作的,但对这个包不起作用。
有人可以帮我解决上述问题并为此套餐添加费率限制吗?
更新 - SuperRequest struct
// 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
}
答案 0 :(得分:0)
您看到错误说明问题。
不能使用newRateLimitTransport(limit,http.DefaultTransport)(类型 http.RoundTripper)作为类型* http.Transport赋值:需要类型 断言
SuperAgent.Transport
类型为*http.Transport
但您尝试将http.RoundTripper
分配给该字段
要解决此问题,您可以更改SuperaAgent
type SuperAgent{
...
Transport http.RoundTripper
...
}