1.简介
在这个简短的教程中,我们将介绍如何发送包含压缩数据的HTTP请求。
此外,我们将介绍如何配置Spring Web应用程序以便处理压缩请求。
2.发送压缩请求
首先,我们创建一个能够压缩字节数组的方法:
public static byte[] compress(byte[] body) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try (GZIPOutputStream gzipOutputStream = new GZIPOutputStream(baos)) {
gzipOutputStream.write(body);
}
return baos.toByteArray();
}
我们将一个字节数组进行了GZIP压缩。
接下来,我们需要实现ClientHttpRequestInterceptor来修改请求。请注意,我们都将发送适当的HTTP压缩标头以及调用我们的上文中的压缩方法:
public ClientHttpResponse intercept(HttpRequest req, byte[] body, ClientHttpRequestExecution exec)
throws IOException {
HttpHeaders httpHeaders = req.getHeaders();
httpHeaders.add(HttpHeaders.CONTENT_ENCODING, "gzip");
httpHeaders.add(HttpHeaders.ACCEPT_ENCODING, "gzip");
return exec.execute(req, compress(body));
}
我们的拦截器使用出站请求体并使用GZIP格式对其进行压缩。在这个例子中,我们使用Java的标准GZIPOutputStream来为我们工作。
此外,我们必须为数据编码添加适当的头。这使目标接口知道我们传输过去的是GZIP压缩的数据,以便正确处理。
最后,我们将拦截器添加到RestTemplate定义中:
@Bean
public RestTemplate getRestTemplate() {
RestTemplate restTemplate = new RestTemplate();
restTemplate.getInterceptors().add(new CompressingClientHttpRequestInterceptor());
return restTemplate;
}
3.处理压缩请求
默认情况下,大多数Web服务器不会主动处理包含压缩数据的请求。Spring Web应用程序也不例外。因此,我们需要配置它们来处理此类请求。
目前,只有Jetty和Undertow Web服务器处理具有GZIP格式数据的请求主体。
3.1. Jetty Web服务器
在此示例中,我们通过添加Jetty GzipHandler来自定义Jetty Web服务器。此Jetty处理程序用于压缩响应和解压缩请求。
我们需要将inflateBufferSize设置为大于零的值以启用解压缩:
@Bean
public JettyServletWebServerFactory jettyServletWebServerFactory() {
JettyServletWebServerFactory factory = new JettyServletWebServerFactory();
factory.addServerCustomizers(server -> {
GzipHandler gzipHandler = new GzipHandler();
gzipHandler.setInflateBufferSize(1);
gzipHandler.setHandler(server.getHandler());
HandlerCollection handlerCollection = new HandlerCollection(gzipHandler);
server.setHandler(handlerCollection);
});
return factory;
}
3.2. Undertow Web Server
同样,我们可以自定义Undertow Web服务器以自动解压缩对我们的请求。在这种情况下,我们需要添加自定义RequestEncodingHandler。
我们配置编码处理程序以处理来自请求的GZIP源数据:
@Bean
public UndertowServletWebServerFactory undertowServletWebServerFactory() {
UndertowServletWebServerFactory factory = new UndertowServletWebServerFactory();
factory.addDeploymentInfoCustomizers((deploymentInfo) -> {
deploymentInfo.addInitialHandlerChainWrapper(handler -> new RequestEncodingHandler(handler)
.addEncoding("gzip", GzipStreamSourceConduit.WRAPPER));
});
return factory;
}
文章评论