[英]Okio Throttler integration with OkHttp
我的團隊在上傳文件時遇到了松弛集成的問題,因此根據該問題中的評論,我想在我們的 Kotlin 實現中限制請求。
我正在嘗試將 Okio Throttler集成到 OkHttp 攔截器中,所以我有以下設置:
val client = OkHttpClient.Builder()
.retryOnConnectionFailure(false)
.addInterceptor { chain ->
val request = chain.request()
val originalRequestBody = request.body
val newRequest = if (originalRequestBody != null) {
val wrappedRequestBody = ThrottledRequestBody(originalRequestBody)
request.newBuilder()
.method(request.method, wrappedRequestBody)
.build()
} else {
request
}
chain.proceed(newRequest)
}
.build()
class ThrottledRequestBody(private val delegate: RequestBody) : RequestBody() {
private val throttler = Throttler().apply {
bytesPerSecond(1024, 1024 * 4, 1024 * 8)
}
override fun contentType(): MediaType? {
return delegate.contentType()
}
override fun writeTo(sink: BufferedSink) {
delegate.writeTo(throttler.sink(sink).buffer())
}
}
似乎throttler.sink
返回一個Sink
,但是方法delegate.writeTo
需要一個BufferedSink
,所以我調用了buffer()
來獲取那個BufferedSink
。 我做錯了嗎? 對.buffer()
的調用是否會破壞集成?
這幾乎是完美的。 您只需要在完成后刷新緩沖區,否則它將在內部完成幾個字節。
override fun writeTo(sink: BufferedSink) {
throttler.sink(sink).buffer().use {
delegate.writeTo(it)
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.