我在Android应用上使用Guava的速率限制器来设置用户每秒可以发出的请求数量的限制。
我的代码:
class MyClient(private val main: Activity) {
private val API = "https://827a2323.ngrok.io"
//max 1 requests per second
private val rateLimiter = RateLimiter.create(1.0)
fun search(p: Parameters, callback: (Array<Thing>) -> Unit) {
makeRequest("$API/search", p, callback)
}
fun random(callback: (Thing) -> Unit) {
makeRequest("$API/random", mutableListOf(), callback)
}
private inline fun <reified T> makeRequest(url: String, p: Parameters, crossinline callback: (T) -> Unit) {
rateLimiter.acquire()
buildPath(url, p)
.httpGet()
.responseJson { _, _, result ->
when (result) {
is Result.Failure -> {
main.runOnUiThread {
Toast.makeText(
main,
"Request Failed! " + result.error,
Toast.LENGTH_LONG
).show()
}
}
is Result.Success -> {
val json = result.get().obj()
Log.i("json", json.toString())
val res = deserialize<T>(json.get("results").toString())
main.runOnUiThread { callback(res) }
}
}
}
}
}
我尝试向我的应用发送垃圾邮件,但我收到Fuel
(我用来发出请求的library)的错误提示,说我发出了太多请求。
我的期望是acquire
呼叫将阻止垃圾邮件传入的请求-仅此而已。这些垃圾邮件请求均不应执行
但这并没有完全发生,因为我从加油中得到了一个错误。
我该怎么做才能缓解这个问题?