【发布时间】:2016-04-11 05:47:18
【问题描述】:
我和我的团队有一个运行 Restfull 网络服务的 Tomcat 服务器,使用 RestEasy 实现:
@POST
@GZIP
@Path("/capture")
@Consumes(MediaType.APPLICATION_JSON)
Response RecieveData(@GZIP RecievingData recievingData);
我们需要对这个服务进行压缩发布。问题是我们没有找到可行的实现。
- 我们尝试使用拦截器: https://hc.apache.org/httpcomponents-client-4.2.x/httpclient/examples/org/apache/http/examples/client/ClientGZipContentCompression.java。但我们无法捕获 POST 请求正文并对其进行压缩。
-
我们尝试使用 RestEasy 客户端,但它似乎没有压缩 Post 请求的正文:www.posttestserver.com/data/2016/01/06/15.33.391016591335
最后我们尝试了一个自定义类:https://gist.github.com/takumakei/913067。但是我们在请求中收到 400 错误:
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