You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jetty从8.1.x升级至9.4.x时HttpExchange类及相关方法替代方案咨询

Jetty 8到9.4版本HttpExchange API替代方案

Jetty 9.4.x版本完全重构了HttpClient组件,原Jetty 8中的org.eclipse.jetty.client.HttpExchange类已被废弃,替代逻辑基于新的org.eclipse.jetty.client.api.Request和org.eclipse.jetty.client.api.Response系列回调接口实现,具体对应关系如下:

原有回调方法对应替代

  • onRequestCommitted():对应Request的QueuedRequestListener#onCommit()回调,请求头写入网络通道时触发
  • onRequestComplete():对应Request的Request.Listener#onSuccess()回调,完整请求(含请求体)发送成功时触发
  • onResponseComplete():对应Response的Response.Listener#onComplete(Result result)回调,完整响应(含响应体)处理完成时触发,可通过result.isSucceeded()判断处理状态
  • onResponseContent(Buffer content):对应Response的Response.Listener#onContent(Response response, ByteBuffer content)回调,接收响应体分片时触发,原Buffer类对应Jetty 9的ByteBuffer,写输出流逻辑可直接复用
  • onResponseHeaderComplete():对应Response的Response.Listener#onHeaders(Response response)回调,所有响应头接收完成时触发
  • onResponseStatus(Buffer version, int status, Buffer reason):对应Response的Response.Listener#onBegin(Response response)回调,可通过response.getVersion()获取HTTP版本,response.getStatus()获取状态码,response.getReason()获取原因短语
  • onResponseHeader(Buffer name, Buffer value):对应Response的Response.Listener#onHeader(Response response, HttpField field)回调,可通过field.getName()、field.getValue()获取头名称和值
  • onConnectionFailed(Throwable ex)/onException(Throwable ex):对应Request和Response的FailureListener#onFailure(Response response, Throwable failure)回调,连接失败、请求/响应处理异常都会触发该回调
  • onExpire():对应Response.Listener#onComplete(Result result)回调,当result.isFailed()且异常类型为TimeoutException时即为超时触发,和原有过期逻辑一致

原有请求属性设置方法对应替代

新的Request对象通过HttpClient.newRequest(uri)创建,原有设置方法对应如下:

  • setScheme():构造Request时传入的完整URL会自动解析scheme,也可通过request.scheme(scheme)手动修改
  • setMethod(String method):对应request.method(method)
  • setURL(String url):构造Request时直接传入url即可,也可通过request.uri(URI.create(url))修改
  • setVersion(String protocol):对应request.version(HttpVersion.fromString(protocol))
  • setRequestHeader(String name, String value):对应request.header(name, value),会覆盖已有同名头
  • addRequestHeader(String name, String value):对应request.headers(headers -> headers.add(name, value)),会追加同名头

完整示例代码

// 初始化HttpClient,建议全局单例复用
HttpClient httpClient = new HttpClient();
httpClient.start();

// 构建请求对象
Request request = httpClient.newRequest(url.toString())
        .method(request.getMethod())
        .version(HttpVersion.fromString(request.getProtocol()))
        .header("Host", _hostHeader)
        .header("Via", request.getProtocol() + " " + host + " (" + getClass().getSimpleName() + ")");

// 追加转发请求头
if (!xForwardedFor) {
    request.headers(headers -> {
        headers.add("X-Forwarded-For", request.getRemoteAddr());
        headers.add("X-Forwarded-Proto", scheme);
        headers.add("X-Forwarded-Host", host);
        headers.add("X-Forwarded-Server", request.getLocalName());
        headers.add(HttpServer.PROXY_URI_HEADER, from.toString());
    });
}

// 绑定所有业务回调
request.onRequestCommit(req -> {
    // 原onRequestCommitted逻辑
})
.onRequestSuccess(req -> {
    // 原onRequestComplete逻辑
})
.onResponseBegin(resp -> {
    // 原onResponseStatus逻辑
    int status = resp.getStatus();
    String reason = resp.getReason();
    HttpVersion version = resp.getVersion();
})
.onResponseHeader((resp, field) -> {
    // 原onResponseHeader逻辑
    String name = field.getName();
    String value = field.getValue();
})
.onResponseHeaders(resp -> {
    // 原onResponseHeaderComplete逻辑
})
.onResponseContent((resp, buffer) -> {
    // 原onResponseContent逻辑
    Channels.newChannel(out).write(buffer.duplicate());
})
.onFailure((resp, throwable) -> {
    // 原onConnectionFailed、onException逻辑
})
.onComplete(result -> {
    if (result.isFailed() && result.getFailure() instanceof TimeoutException) {
        // 原onExpire逻辑
        onException(new SocketTimeoutException());
    }
    // 原onResponseComplete逻辑
});

// 发起请求:异步调用用request.send(null),同步调用用request.send()

内容的提问来源于stack exchange,提问作者shubham_agrawal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 10:30:01