【问题标题】:How to compress a Http Post Body using GZIP如何使用 GZIP 压缩 Http Post Body
【发布时间】:2016-04-11 05:47:18
【问题描述】:

我和我的团队有一个运行 Restfull 网络服务的 Tomcat 服务器,使用 RestEasy 实现:

@POST
@GZIP
@Path("/capture")   
@Consumes(MediaType.APPLICATION_JSON)
Response RecieveData(@GZIP RecievingData recievingData);

我们需要对这个服务进行压缩发布。问题是我们没有找到可行的实现。

HTTP/1.1 400 错误请求 [内容编码:gzip,内容类型: 文本/html; charset=UTF-8,日期:星期四,2016 年 1 月 7 日 10:07:05 GMT,服务器: Apache-Coyote/1.1,内容长度:66,连接:保持活动]

我们没有想法,这应该是一个 HTTP 客户端的简单函数。有什么想法吗?

OBS:这是 RestEasy 代理:

@POST   
@GZIP
@Consumes(MediaType.APPLICATION_JSON)
public Response saveData(@GZIP RecievingData customer);

编辑:在防火墙中进行了一些更改,第三种方法更改为错误 400。

【问题讨论】:

  • 我不熟悉@GZIP 注释,所以这只是一件可能重要或可能不重要的事情。作为一个压缩数据(在帖子中),该方法的参数不是某种流吗?正如我所说,这里只是好奇的问题......
  • 我们在两个帖子上都尝试了解决方案,但一无所获。
  • “压缩后的帖子”可能意味着几件事,具体取决于请求或响应或两者。即拦截器应该 gzip 请求正文的 outStream 还是应该拦截器 gunzip 响应的 inStream 或两者..考虑将所需的拦截器包装在您的协议周围以进行 http 连接。
  • 使用普通 JAX-RS 客户端或 RESTeasy 客户端,尝试注册this interceptor,并将请求中的Content-Encoding 标头设置为gzip

标签: java apache httpclient resteasy


【解决方案1】:

如果使用 Tomcat,为什么不添加一个 RequestFilter 来预处理收到的包含标头 Content-Encoding: gzip 的请求并在过滤器链的其余部分处理它之前解压缩它?

编辑: 我猜您的第三个选项实际上可能有效(窥探网络以验证),问题是您收到了来自服务器的 403 - Forbidden 响应。这是授权问题,而不是 URL、请求编码或其他任何东西。 GZIP 现在可能确实适合您。

编辑: HTTP 响应代码 400 - Bad Request 的最新输出显示 Content-Type: text/html。 Controller 期望 Content-Type: application/json,所以客户端没有按照 Controller 的要求设置 ContentType。重新检查您的客户端代码的使用和配置。

【讨论】:

  • 无视。您的意思是客户端请求提交,而不是服务器端请求处理。
【解决方案2】:

最后我使用了服务端和客户端的Resteasy框架来实现GZIP压缩。

服务器端: https://docs.jboss.org/resteasy/docs/2.3.0.GA/userguide/html/gzip.html

客户端: https://docs.jboss.org/resteasy/docs/2.2.1.GA/userguide/html/RESTEasy_Client_Framework.html

这对我有用。

【讨论】:

    猜你喜欢
    • 2015-10-21
    • 1970-01-01
    • 1970-01-01
    • 2012-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-11
    相关资源
    最近更新 更多