使用HTTP Java客户端执行异步请求时如何处理错误?

时间:2019-05-24 09:40:28

标签: java java-11 java-http-client

我正在使用新的Java 11 HTTP Client。我有一个类似的请求:

httpClient.sendAsync(request, discarding())

如何为HTTP错误添加处理程序?我需要记录错误,但我想保持请求异步。

当前,诸如400500之类的HTTP错误是静默的。 在这种情况下,我想记录状态代码和响应正文。 我想CompletableFuture就像一个诺言,所以那里还没有答复。

1 个答案:

答案 0 :(得分:2)

您只需要在HttpClient::sendAsync返回的可完成未来中注册一个从属操作

这里是一个例子:

public static void main(String[] argv) {
    var client = HttpClient.newBuilder().build();
    var request = HttpRequest.newBuilder()
            .uri(URI.create("http://www.example.com/"))
            .build();
    var cf = client.sendAsync(request, HttpResponse.BodyHandlers.discarding())
            .thenApplyAsync((resp) -> {
                int status = resp.statusCode();
                if (status != 200) {
                    System.err.println("Error: " + resp.statusCode());
                } else {
                    System.out.println("Success: " + resp.statusCode());
                }
                return resp;
            });
    cf.join(); // prevents main() from exiting too early
}