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));
        }
相关推荐
我命由我123458 小时前
Jetpack Room - Room 查询返回列表无需判空、LIKE 关键字
android·java·开发语言·java-ee·android jetpack·android-studio·android runtime
hbugs0018 小时前
EVE-NG V7常用网络协议流量洞察Filter
网络·网络协议
朝星8 小时前
Android开发[14]:网络优化之OkHttp
android·okhttp·kotlin
私人珍藏库8 小时前
[Android] FX Player-安卓全格式播放器-比MX播放器好用
android·学习·工具·软件·多功能
七夜zippoe9 小时前
DolphinDB WebSocket接入:实时数据流
网络·websocket·网络协议·dolphindb·实时数据流
写点啥呢9 小时前
车机 Android 开机优化复盘:我怎么和 AI 一起把问题定位到 SystemUI
android·人工智能
SomeOtherTime9 小时前
http协议处理播放video/mp4视频
http
Peter(阿斯拉)10 小时前
[Android]_[中级]_[如何创建MVVM架构原型]
android·java·架构·mvvm·viewmodel
勇敢牛牛_10 小时前
Zeplyn:通过P2P构建服务共享网络
网络·网络协议·p2p·服务
kingbal10 小时前
Flutter:Flutter SDK版本管理工具FVM
android·flutter·ios·android-studio·window