我需要发送一个带有gzip压缩的HTTPPost,服务器也接受非压缩数据但是更喜欢gzip压缩,所以我试图将一些现有的workign代码转换为使用gzip 数据目前设置为
httpMethod.setEntity(new UrlEncodedFormEntity(nameValuePairs));
我尝试过子类化HttpEntityWrapper
static class GzipWrapper extends HttpEntityWrapper
{
public GzipWrapper(HttpEntity wrapped)
{
super(wrapped);
}
public void writeTo(OutputStream outstream)
throws IOException
{
GZIPOutputStream gzip = new GZIPOutputStream(outstream);
super.writeTo(gzip);
}
}
并改为
httpMethod.setEntity(new GzipWrapper(
new UrlEncodedFormEntity(nameValuePairs)));
并添加了
if (!httpMethod.containsHeader("Accept-Encoding"))
{
httpMethod.addHeader("Accept-Encoding", "gzip");
}
但是现在我的请求只是暂停了我认为我的GZIpWrapper一定有问题,但我不确定是什么。
另一方面,我看了http://hc.apache.org/httpcomponents-client-ga/httpclient/examples/org/apache/http/examples/client/ClientGZipContentCompression.java。例。除了我不喜欢拦截器的事实,因为它很难跟踪程序流程它对我没有意义,因为请求标头被设置为告诉服务器接受gzip数据但是它实际上没有gzip编码任何数据,它只是解压缩回应。
答案 0 :(得分:2)
(1)GzipWrapper实现错误。它在将实体内容写入输出流时转换实体内容,但它仍然返回包装实体的Content-Length,这导致服务器期望输入比客户端实际传输的更多。
(2)你完全误解了Accept-Encoding
标题
http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
(3)ClientGZipContentCompression示例是正确的。它不压缩传出请求实体,因为它不是这样做的。见第(2)点