1

我一直在我的 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
}
4

1 回答 1

0

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

不能使用 newRateLimitTransport(limit, http.DefaultTransport) (type http.RoundTripper) 作为 type *http.Transport in assignment: 需要类型断言

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

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

type SuperAgent{
...
Transport  http.RoundTripper
...
}
于 2018-02-13T02:40:14.897 回答