DebugEN
科技森
专注于Java开发~每天都会更新文章~
  1. 首页
  2. spring
  3. 正文

使用Spring RestTemplate压缩请求

2021年02月12日 1279点热度 0人点赞 0条评论 作者: kejisen

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;
}
标签: resttemplate spring springboot
最后更新:2021年03月03日

kejisen

保持饥渴的专注,追求最佳的品质

点赞
< 上一篇
下一篇 >

文章评论

取消回复
最新 热点 随机
最新 热点 随机
【原创】记录一次失败的折腾——使用jkeymaster实现的按键监听 【原创】这些年我用过的IDEA插件 【原创】在windows上使用VNC远程连接linux桌面 我在RxJava使用线程池时遇到的问题 [原创文章] Swagger生成pdf格式的接口文档 [个人翻译]Java HTTP工具类的客户端证书认证 [原创] 如何从 Git 的提交历史记录中删除大文件 [翻译] 创建一个只读的Repository接口(Spring Data) [翻译] 反射的用法——用Java调用私有方法 Java 虚拟机最多可以支持多少个线程? 排查Hibernate的慢查询日志–这是查找慢查询的最简单方法 [翻译] 使用apache poi在excel文件中插入一行数据 [翻译] 在Spring 中@EntityScan与@ComponentScan注解有什么区别 [原创] 从QQ音乐网页版扒歌词的补充说明 [原创] 介绍java maven项目的多种打包方式 原创——在Java中生成随机数 将G1垃圾回收的内存使用量减少20%(翻译) [原创] java8 lambda表达式的toMap造成的空指针异常 [原创] 在Spring Boot中使用CommandLineRunner来在启动时执行代码 [转载] Kafka 节点重启失败导致数据丢失的分析排查与解决之道
排查Hibernate的慢查询日志–这是查找慢查询的最简单方法 [原创文章] Swagger生成pdf格式的接口文档 [原创] 如何使用okhttp发起application/json类型的请求 [原创] 如何使用java(javamail)发送带附件的邮件 Spring Boot项目修改Tomcat端口号 java maven项目的几种打包方式 [个人翻译]Java HTTP工具类的客户端证书认证 Spring Boot的@RequestMapping注解中加斜杠与不加斜杠的区别 从QQ音乐获取并解析音乐的歌词 Linux截图软件推荐-flameshot [翻译] 在Spring 中@EntityScan与@ComponentScan注解有什么区别 如何设置Servlet的session超时时间 [翻译] 使用apache poi在excel文件中插入一行数据 [原创] 如何从 Git 的提交历史记录中删除大文件 将G1垃圾回收的内存使用量减少20%(翻译) [原创]javaslang(vavr.io)中Try的使用 [原创] Spring Boot使用CommandLineRunner [原创] 介绍java maven项目的多种打包方式 在Java中生成随机的日期 使用Spring RestTemplate压缩请求
标签聚合
qq音乐 json maven elasticsearch java 歌词 springboot base64 linux spring

COPYRIGHT © 2020 Kejisen. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY VTROIS