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

4

我正在使用新的Java 11 HTTP客户端。我有一个请求如下:

httpClient.sendAsync(request, discarding())

如何添加HTTP错误处理程序?我需要记录错误,但希望保持请求异步。
目前,HTTP错误(如400或500)是不会提示的。我想在这些情况下记录状态码和响应主体。我想CompletableFuture就像一个promise一样,所以回复在那里还不可用。

2
你能具体说明一下在这个上下文中你所说的 HTTP 错误 是什么意思吗?Java API 返回给你一个 CompletableFuture<HttpResponse<T>>,你想从中推断出什么或者是有什么遗漏是你所要求的吗? - Naman
请检查编辑 - Luís Soares
1个回答

4
你只需要使用HttpClient::sendAsync返回的CompletableFuture注册一个依赖的操作即可。
以下是一个例子:
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
}

join 不会再次阻塞吗? - Luís Soares
是的 - 这只是为了防止 main() 方法在请求完成并接收到响应之前退出。 - daniel
但是如果我的应用程序运行时间很长,我就不需要使用sendAsync了吧?如果它是阻塞的,我只需使用send即可。 - Luís Soares
1
没错。这是一个简单的程序,只发送一个请求。客户端是完全异步的。甚至连接服务器也是异步的。这意味着,根据服务器响应的速度(快或慢),如果你不强制等待足够长的时间,程序可能在发送、接收或打印任何内容之前就退出了。 - daniel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接