将自定义传输添加到第三方软件包

时间:2018-02-13 00:48:45

标签: http go transport roundtrip

我在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
}

1 个答案:

答案 0 :(得分:0)

您看到错误说明问题。

  

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

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

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

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