【发布时间】:2018-11-19 16:39:04
【问题描述】:
我正在使用新的 java.net.http 类来处理异步 HTTP 请求+响应交换,并且我正在尝试找到一种方法让 BodySubscriber 处理不同的编码类型,例如 gzip。
但是,映射BodySubsriber<InputStream> 以便底层流被GZIPInputStream 包装(当在响应标头中找到“Content-Encoding: gzip”时)会导致挂起。没有例外,只是完全停止活动。
映射BodySubscriber 的代码如下所示:
private HttpResponse.BodySubscriber<InputStream> gzippedBodySubscriber(
HttpResponse.ResponseInfo responseInfo) {
return HttpResponse.BodySubscribers.mapping(
HttpResponse.BodySubscribers.ofInputStream(),
this::decodeGzipStream);
}
private InputStream decodeGzipStream(InputStream gzippedStream) {
System.out.println("Entered decodeGzipStream method.");
try {
InputStream decodedStream = new GZIPInputStream(gzippedStream);
System.out.println(
"Created GZIPInputStream to handle response body stream.");
return decodedStream;
} catch (IOException ex) {
System.out.println("IOException occurred while trying to create GZIPInputStream.");
throw new UncheckedIOException(ex);
}
}
接收具有“gzip”编码的 HTTP 响应会导致控制台显示以下内容:
进入 EncodedBodyHandler.apply 方法。
进入decodeGzipStream方法。
什么都没有看到,所以调用 GZIPInputStream 构造函数之后的行永远不会执行。
有谁知道为什么将BodySubscriber<InputStream> 中的InputStream 包装在GZIPInputStream 中的尝试失败了?
注意:未编码(原始文本)HTTP 响应正文的等效方法仅包含对 BodySubscribers.ofInputStream() 的调用,没有映射,这样可以毫无问题地接收和显示响应。
【问题讨论】:
标签: java gzipinputstream java-http-client