使用Apache Client 4.1.1解决HttpPost主体的问题

时间:2011-05-11 10:12:32

标签: java http httpclient http-post

我需要发送一个带有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编码任何数据,它只是解压缩回应。

1 个答案:

答案 0 :(得分:2)

(1)GzipWrapper实现错误。它在将实体内容写入输出流时转换实体内容,但它仍然返回包装实体的Content-Length,这导致服务器期望输入比客户端实际传输的更多。

(2)你完全误解了Accept-Encoding标题

的目的

http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

(3)ClientGZipContentCompression示例是正确的。它不压缩传出请求实体,因为它不是这样做的。见第(2)点