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));
        }
相关推荐
小鸟啄米2 小时前
Elixir通过Onvif协议控制IP摄像机,扩展ExOnvif的摄像头连续移动功能 ContinuousMove
网络协议·elixir·onvif
一只游鱼2 小时前
利用keytool实现https协议(生成自签名证书)
网络协议·http·https·keytool
用户0273851840263 小时前
[Android]RecycleView的item用法
android
学会煎墙3 小时前
3分钟快速入门WebSocket
网络·websocket·网络协议
码熔burning4 小时前
RPC 和 HTTP 的区别
网络协议·http·rpc
前行的小黑炭4 小时前
Android :为APK注入“脂肪”,论Android垃圾代码在安全加固中的作用
android·kotlin
帅得不敢出门5 小时前
Docker安装Ubuntu搭建Android SDK编译环境
android·ubuntu·docker
tangweiguo030519875 小时前
Android Kotlin 动态注册 Broadcast 的完整封装方案
android·kotlin
赖龙5 小时前
记录SSL部署,链路不完整问题
网络·网络协议·ssl
fatiaozhang95275 小时前
浪潮CD1000-移动云电脑-RK3528芯片-2+32G-安卓9-2种开启ADB ROOT刷机教程方法
android·网络·adb·电脑·电视盒子·刷机固件·机顶盒刷机