相关疑难解决方法(0)

在Spring Boot REST应用程序中处理gzip压缩请求

我有一个Spring Boot REST应用程序(1.5.6.RELEASE).我想gzip压缩传入和传出.根据这个文档https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html我已经设置

server.compression.enabled=true
server.compression.mime-types=...
Run Code Online (Sandbox Code Playgroud)

但这似乎只适用于从我的服务gzipping响应(这就是文档实际上说的"#如果启用了响应压缩.").

我的问题是传入的gzip压缩请求没有被解压缩,导致JSON解析错误.

有谁知道如何在我的Spring Boot应用程序中打开请求解压缩?

编辑一个例子:

POM片段:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.6.RELEASE</version>
</parent>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>
Run Code Online (Sandbox Code Playgroud)

控制器代码:

@RestController
public class Controller {
    @RequestMapping(value = "/", method = RequestMethod.POST, consumes = "application/json")
    public String post(@RequestBody Map<String, String> request) {
        return request.get("key");
   }
}
Run Code Online (Sandbox Code Playgroud)

使用curl测试:

$ echo '{ "key":"hello" }' > body
$ curl -X POST -H "Content-Type: application/json" --data-binary @body http://localhost:8080 # prints 'hello'
$ echo '{ "key":"hello" }' | gzip > …
Run Code Online (Sandbox Code Playgroud)

java rest spring spring-boot

8
推荐指数
1
解决办法
4247
查看次数

为什么 POST 方法期间请求正文的 GZIP 压缩不常见?

我最近在玩 GZIP 压缩以及我理解以下内容的方式:

  1. 客户端从 Web 服务器请求一些文件或数据。客户端还会发送一个标头,上面写着“Accept-Encoding,gzip”
  2. Web Server 检索文件或数据,对其进行压缩,然后将它们以 GZIP 压缩格式发送回客户端。Web 服务器还发送一个标题为“Content-Encoded,gzip”,以通知客户端数据已被压缩。
  3. 客户端然后解压缩数据/文件并为用户加载它们。

我知道这是一种常见的做法,当您需要加载需要大量 HTML、CSS 和 JavaScript 的页面时,这很有意义,这些页面可能相对较大,并且会增加浏览器的加载时间。

但是,我试图进一步研究这一点,为什么在进行 POST 调用时 GZIP 压缩请求正文并不常见?是不是因为通常请求主体很小,所以在 Web 服务器上解压缩文件所需的时间比简单地发送请求所需的时间长?是否有关于此的某种文件或参考资料?

谢谢!

post gzip http-compression

8
推荐指数
2
解决办法
6896
查看次数

HTTP请求压缩

一般用例

想象一个客户端正在上传大量JSON。应该保留Content-Type,application/json因为它描述了实际数据。Accept-Encoding和Transfer-Encoding似乎是在告诉服务器应如何格式化响应。看来,响应为此目的明确使用了Content-Encoding头,但这不是有效的请求头。

我有什么想念的吗?有没有人找到一个优雅的解决方案?

具体用例

我的用例是,我有一个移动应用程序,该应用程序生成大量JSON(在某些情况下会生成一些JSON数据,但程度较小),并且压缩请求可以节省大量带宽。我使用Tomcat作为我的Servlet容器。我将Spring用于它的MVC注释,主要是为了将JEE的某些内容抽象到一个更加整洁,基于注释的接口中。我还使用Jackson进行自动(反序列化)。

我也使用nginx,但是我不确定那是否是我想要进行减压的地方。Nginx节点仅平衡请求,然后通过数据中心分发这些请求。保持压缩,直到它真正到达要处理的节点,这将是同样好的。

提前致谢,

约翰

编辑:

我和@DaSourcerer之间的讨论对撰写本文时对事物状态感到好奇的人真的很有帮助。

我最终实现了自己的解决方案。请注意,这指定了分支“ ohmage-3.0”,但是它将很快合并到master分支中。您可能要检查那里以查看我是否进行了任何更新/修复。

https://github.com/ohmage/server/blob/ohmage-3.0/src/org/ohmage/servlet/filter/DecompressionFilter.java

java compression spring gzip http

4
推荐指数
2
解决办法
1万
查看次数

标签 统计

gzip ×2

java ×2

spring ×2

compression ×1

http ×1

http-compression ×1

post ×1

rest ×1

spring-boot ×1