首页 > 解决方案 > Google HttpResponse - 使用重试逻辑时如何更新标头

问题描述

我正在尝试防止遇到我遇到的特定错误情况。当我发出 HttpResponse 来构建请求并执行它时,我冒着遇到一些速率限制问题的风险(即使使用 Google RateLimiter 来尝试缓解这种情况)。我认为有意义的是将 HttpBackOffUnsuccessfulResponseHandler 与 ExponentialBackoff 一起使用,这样可以解决问题(因为请求的等待时间非常短。)

但是,在测试过程中,我开始意识到我正在访问的 api 端点需要一个随机数,并且您不能使用相同的随机数连续进行相同的调用(此数据是请求标头的一部分.)

我正在尝试确定是否有一种方法可以使用现有的 HttpBackOffUnsuccessfulResponseHandler 并让它在每次重试之前更新其中一个标题。这很容易做到吗,还是我基本上必须创建自己的 HttpBackOffUnsuccessfulResponseHandler 版本?或者在这一点上,在检测到速率限制违规的情况下,手动捕获并在等待指定时间后重建/重新发送请求是否有意义?(我要访问的 API 端点将包括由于速率限制而需要等待的时间。)

我考虑过只是扩展 HttpBackOffUnsuccessfulResponseHandler 但它的实现方式,我无法覆盖可能让我有机会在重新发送请求之前更新请求的 handleResponse 调用。

我当前如何构建请求的示例如下(已清理):

//Please note these headers are just an example. This data should not be treated as real.
HttpHeaders headers = new HttpHeaders()
    .setContentType("text/plain").setContentLength(0L)
    .set("header-1", header1Data.toString)
    .set("payload", payload.toString); // Contains the nonce that would need to be updated.

HttpResponse resp = httpRequestFactory.buildPostRequest(url, null)
    .setHeaders(headers)
    .setConnectTimeout(30000)
    .setReadTimeout(30000)
    .setUnsuccessfulResponseHandler(
        new HttpBackOffUnsuccessfulResponseHandler(new ExponentialBackoff())
            //BlanketBackoffRequirement is a custom implementation of the BackOffRequired interface
            .setBackOffRequired(BlanketBackoffRequirement.SERVER_ERROR_OR_RATE_LIMIT)
    )
    .execute();

标签: javagoogle-http-client

解决方案


推荐阅读