JDK17 Http Request 异步处理 源码刨析

为什么可以异步?

#调用起始源码

// 3. 发送异步请求并处理响应

CompletableFuture future = client.sendAsync(

request,

HttpResponse.BodyHandlers.ofString() // 响应体转为字符串

).thenApply(response -> {

// 状态码检查(非200系列抛出异常)

if (response.statusCode() < 200 || response.statusCode() >= 300) {

throw new RuntimeException("HTTP错误: " + response.statusCode());

}

return response;

}).thenApply(HttpResponse::body) // 提取响应体3

.thenAccept(body -> {

// 4. 打印响应结果(截取前100字符示例)

try {

Thread.sleep(5000);

} catch (InterruptedException e) {

throw new RuntimeException(e);

}

System.out.println("\n▼ 响应内容 (前100字符):\n"

  • body.substring(0, Math.min(100, body.length())) + "...");

}).exceptionally(e -> {

// 5. 异常处理(提取根本原因)

Throwable root = e;

while (root.getCause() != null) root = root.getCause();

System.err.println("❌ 请求失败: " + root.getMessage());

return null;

});

#client.sendAsync

复制代码
public CompletableFuture<T> whenComplete(
    BiConsumer<? super T, ? super Throwable> action) {
    return uniWhenCompleteStage(null, action);
}

@Override

public CompletableFuture<HttpResponse>

sendAsync(HttpRequest userRequest, BodyHandler responseHandler)

{

return sendAsync(userRequest, responseHandler, null);

}

复制代码
@Override
public <T> CompletableFuture<HttpResponse<T>>
sendAsync(HttpRequest userRequest,
          BodyHandler<T> responseHandler,
          PushPromiseHandler<T> pushPromiseHandler) {
    return sendAsync(userRequest, responseHandler, pushPromiseHandler, delegatingExecutor.delegate);
}

#关键在这里

@SuppressWarnings("removal")

private CompletableFuture<HttpResponse>

sendAsync(HttpRequest userRequest,

BodyHandler responseHandler,

PushPromiseHandler pushPromiseHandler,

Executor exchangeExecutor) {

复制代码
    Objects.requireNonNull(userRequest);
    Objects.requireNonNull(responseHandler);



        MultiExchange<T> mex = new MultiExchange<>(userRequest,
                                                        requestImpl,
                                                        this,
                                                        responseHandler,
                                                        pushPromiseHandler,
                                                        acc);
        CompletableFuture<HttpResponse<T>> res =
                mex.responseAsync(executor).whenComplete((b,t) -> unreference());
        if (DEBUGELAPSED) {
            res = res.whenComplete(
                    (b,t) -> debugCompleted("ClientImpl (async)", start, userRequest));
        }
相关推荐
7ACE1 小时前
Wireshark TS | 发送数据超出接收窗口
网络协议·tcp/ip·wireshark
先知后行。2 小时前
网络协议HTTP、TCP(草稿)
网络·网络协议
你过来啊你3 小时前
Android用户鉴权实现方案深度分析
android·鉴权
自由鬼3 小时前
Apache HTTP Server 2.4.49 的目录遍历漏洞CVE-2021-41773
网络协议·http·apache
极地星光4 小时前
TCP/IP 网络编程面试题及解答
网络·网络协议·tcp/ip
kerli5 小时前
Android 嵌套滑动设计思想
android·客户端
恣艺6 小时前
LeetCode 854:相似度为 K 的字符串
android·算法·leetcode
Lucky高6 小时前
HTTP和HTTPS复习
网络协议·http·https
阿华的代码王国6 小时前
【Android】相对布局应用-登录界面
android·xml·java