Я также был удивлен, что новая инфраструктура java.net.http
не обрабатывает это автоматически, но следующее работает для меня, чтобы обрабатывать ответы HTTP, которые получены как InputStream
и которые либо распакованы, либо сжаты с помощью gzip:
public static InputStream getDecodedInputStream(
HttpResponse<InputStream> httpResponse) {
String encoding = determineContentEncoding(httpResponse);
try {
switch (encoding) {
case "":
return httpResponse.body();
case "gzip":
return new GZIPInputStream(httpResponse.body());
default:
throw new UnsupportedOperationException(
"Unexpected Content-Encoding: " + encoding);
}
} catch (IOException ioe) {
throw new UncheckedIOException(ioe);
}
}
public static String determineContentEncoding(
HttpResponse<?> httpResponse) {
return httpResponse.headers().firstValue("Content-Encoding").orElse("");
}
Обратите внимание, что я не добавил поддержку типа "deflate" (потому что в настоящее время он мне не нужен, и чем больше я читаю о "deflate", тем больше беспорядка это звучало).Но я полагаю, что вы можете легко поддержать «deflate», добавив проверку к вышеуказанному блоку переключателей и заключив httpResponse.body()
в InflaterInputStream
.