如何使用 GZIP 压缩 Http Post Body
How to compress a Http Post Body using GZIP
我和我的团队有一个 Tomcat 服务器 运行 一个 Restfull 网络服务,使用 RestEasy 实现:
@POST
@GZIP
@Path("/capture")
@Consumes(MediaType.APPLICATION_JSON)
Response RecieveData(@GZIP RecievingData recievingData);
我们需要对该服务进行压缩post。问题是我们没有找到有效的实现。
- 我们尝试使用拦截器:
https://hc.apache.org/httpcomponents-client-4.2.x/httpclient/examples/org/apache/http/examples/client/ClientGZipContentCompression.java。但是我们无法捕获 POST 请求 Body 并对其进行压缩。
我们尝试使用 RestEasy 客户端,但它似乎没有压缩 Post 请求的主体:www.posttestserver.com/data/2016/01/06/15.33.391016591335
最后我们尝试了一个自定义的class:https://gist.github.com/takumakei/913067。但是我们在请求中遇到了 400 错误:
HTTP/1.1 400 Bad Request [Content-Encoding: gzip, Content-Type:
text/html; charset=UTF-8, Date: Thu, 07 Jan 2016 10:07:05 GMT, Server:
Apache-Coyote/1.1, Content-Length: 66, Connection: keep-alive]
我们没有想法,这应该是 HTTP 客户端的一个简单函数。有什么想法吗?
OBS:这是 RestEasy 代理:
@POST
@GZIP
@Consumes(MediaType.APPLICATION_JSON)
public Response saveData(@GZIP RecievingData customer);
编辑:在防火墙中进行了一些更改,第三种方法更改为错误 400。
如果使用 Tomcat 为什么不添加一个 RequestFilter 将 pre-process 接收包含 header Content-Encoding 的请求:gzip 并在过滤器链的其余部分之前将其解压缩处理了吗?
编辑:
我猜你的第三个选项可能真的有效(窥探网络以验证),问题是你从服务器得到 403 - Forbidden 响应。这是授权问题,而不是 URL、请求编码或其他任何问题。 GZIP 现在可能正在为您工作。
编辑:
HTTP 响应代码 400 - 错误请求的最新输出显示 Content-Type:text/html。 Controller 期望 Content-Type: application/json,因此客户端没有按照 Controller 的要求设置 ContentType。重新检查客户端代码的使用和配置。
最后我在服务端和客户端使用了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
这对我有用。
我和我的团队有一个 Tomcat 服务器 运行 一个 Restfull 网络服务,使用 RestEasy 实现:
@POST
@GZIP
@Path("/capture")
@Consumes(MediaType.APPLICATION_JSON)
Response RecieveData(@GZIP RecievingData recievingData);
我们需要对该服务进行压缩post。问题是我们没有找到有效的实现。
- 我们尝试使用拦截器: https://hc.apache.org/httpcomponents-client-4.2.x/httpclient/examples/org/apache/http/examples/client/ClientGZipContentCompression.java。但是我们无法捕获 POST 请求 Body 并对其进行压缩。
我们尝试使用 RestEasy 客户端,但它似乎没有压缩 Post 请求的主体:www.posttestserver.com/data/2016/01/06/15.33.391016591335
最后我们尝试了一个自定义的class:https://gist.github.com/takumakei/913067。但是我们在请求中遇到了 400 错误:
HTTP/1.1 400 Bad Request [Content-Encoding: gzip, Content-Type: text/html; charset=UTF-8, Date: Thu, 07 Jan 2016 10:07:05 GMT, Server: Apache-Coyote/1.1, Content-Length: 66, Connection: keep-alive]
我们没有想法,这应该是 HTTP 客户端的一个简单函数。有什么想法吗?
OBS:这是 RestEasy 代理:
@POST
@GZIP
@Consumes(MediaType.APPLICATION_JSON)
public Response saveData(@GZIP RecievingData customer);
编辑:在防火墙中进行了一些更改,第三种方法更改为错误 400。
如果使用 Tomcat 为什么不添加一个 RequestFilter 将 pre-process 接收包含 header Content-Encoding 的请求:gzip 并在过滤器链的其余部分之前将其解压缩处理了吗?
编辑: 我猜你的第三个选项可能真的有效(窥探网络以验证),问题是你从服务器得到 403 - Forbidden 响应。这是授权问题,而不是 URL、请求编码或其他任何问题。 GZIP 现在可能正在为您工作。
编辑: HTTP 响应代码 400 - 错误请求的最新输出显示 Content-Type:text/html。 Controller 期望 Content-Type: application/json,因此客户端没有按照 Controller 的要求设置 ContentType。重新检查客户端代码的使用和配置。
最后我在服务端和客户端使用了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
这对我有用。