- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我一直在使用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/
我想知道是否有一种方法可以自动下载所有导入。因此,假设我需要在我的代码库中使用 github.com/gorilla/mux 和其他几个包。我应该手动转到我的 ~/go/src 并运行 go get
如果我添加第 3 方 bundle ,请说来自 Knp bundles例如,我应该先包装它还是应该直接在我的代码中使用它? 如果我决定包装它,我将包装代码放在哪里?在单独的新 bundle 中?在我的
我试图弄清楚这是否是我的设计中的错误,或者是 redis-py 库中的错误。本质上,我对 Python 中命名空间的理解是,包的设计应该使所有组件都位于包命名空间之下。意思是,如果我在 package
我是 Golang 的新手,在学习这门语言时一直采用 TDD 方法。我一直相处得很好,但我发现测试第三方包非常笨拙,这让我相信我一直在采取错误的方法。 我遇到麻烦的具体情况是模拟 Redis clie
我创建了 Angular 库 ( ngx-wig ),我想提供一种使用插件 来扩展其功能的能力。 在 Angular 中声明插件的最佳位置是什么? (可能类似于 myLibModule.forRoot
我一直在尝试找出如何将我自己的包添加为 kickstart 安装的一部分(特别是 mondo 包),但使用 %packages 指令而不是 post 脚本中的 rpm 命令。我尝试使用 kicksta
我正在尝试在 Node 中使用 d3(并且之前以某种方式成功地完成了?)。所以我就这么做了 npm install -g d3 效果很好。让我们检查一下: $ npm list -g d3 /usr/
美好的一天, 我目前是 webpack 中集成 vue.js 的新手。 基本上,我正在尝试使用已经安装在我的node_modules中的第3方软件包。 在此示例中,我安装了一个名为“Vuex Toas
我是一名优秀的程序员,十分优秀!