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
相关产品推荐
相关产品推荐

