如何正确处理 HTTP 请求错误?

唐吉奥特

我有一个简单的 http 客户端,它将每个请求传递给 ExecutorService 并延迟应用它们。

    protected static final int RETRY_ATTEMPTS = 5;
    private static final int GROUP_REQUEST_DELAY_MS = 55;
    private static final ScheduledExecutorService REQUEST_FROM_USER_EXECUTOR = 
        Executors.newSingleThreadScheduledExecutor();

    public RequestResponse post(String url) throws IOException {
        HttpPost httpPost = new HttpPost(url);
        HttpResponse httpResponse = call(httpPost);

        return new RequestResponse(
            httpResponse.getStatusLine().getStatusCode(),
            EntityUtils.toString(httpResponse.getEntity()),
            headers(httpResponse.getAllHeaders())
        );
    }

    private HttpResponse call(HttpRequestBase request) throws IOException {
        int attempts = 0;

        HttpResponse httpResponse = null;
        SocketException socketException = null;
        do {
            try {
                httpResponse = client.execute(request);
            } catch(SocketException e) {
                socketException = e;
            }

            if(httpResponse != null)
                break;

            attempts++;
            log.debug("Attempt: {}, SocEx: {}", attempts, socketException != null);
        }while(attempts < RETRY_ATTEMPTS);

        if(httpResponse == null)
            // TODO

        if(socketException != null) {
            log.error("Network problem");
            logRequest(request, httpResponse);
            throw socketException;
        }

        return httpResponse;
    }

    public synchronized Future<RequestResponse> sendAsGroup(String url) {
        return REQUEST_FROM_GROUP_EXECUTOR.schedule(() -> post(url), GROUP_REQUEST_DELAY_MS, TimeUnit.MILLISECONDS);
    }

有时服务器会抛出一个 http 504 错误左右。我想处理这个错误并重新提交这个请求。如何在不超过服务器请求限制的情况下正确执行此操作?

ok2c

您应该HttpRequestRetryHandler用于从传输级别 (TCP) 错误中恢复并ServiceUnavailableRetryStrategy在出现协议级别 (HTTP) 错误时重试请求执行。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何正确处理请求承诺错误?

使用Nestjs HTTP模块向Axios发出HTTP请求时如何正确处理返回的observable

如何正确处理HTTP文件服务器上的客户端“连接:关闭”请求?

如何正确处理角度路由订阅,然后将参数用于并行http请求

在Kotlin中使用HTTP客户端时如何正确处理错误?

Angular 4:如何将应用程序级别的 http 错误正确处理为 Observable 错误?

如何正确处理PDO连接错误?

Laravel API,如何正确处理错误

如何正确处理错误输入(JAVA)

Firebase函数如何正确处理错误

使用 SPA 且没有服务器端计算时,如何正确处理 404 HTTP 错误?

正确处理错误

如何正确处理错误并正确使用承诺

如何正确处理HTTP doPOST和doGet方法?

如何正确处理一个ajax请求

如何使Sinatra正确处理其中包含数组的JSON请求?

未启用SSL的SSL请求应如何正确处理?

如何在 MVVM 中使用 RxSwift 正确处理来自 api 请求的错误?

重击:正确处理错误

我应该如何正确处理代码中的空错误?

如何正确处理Node.js中的异步错误

如何在Laravel中正确处理错误?

如何正确处理hystrix后备广告中的预期错误?

Promise链中如何正确处理错误?

如何正确处理多个运行时错误?

如何确保此函数正确处理错误?

如何正确处理 VBA 中的 FollowHyperlink 错误?

如何正确处理来自json响应的错误

如何修复 HTTP 错误 400:错误请求?