Java中HTTPClient的GZip POST请求

Java中HTTPClient的GZip POST请求,java,gzip,httpclient,Java,Gzip,Httpclient,我需要向web服务器发送一个POST请求,其中包含一个gzip请求参数。我正在使用ApacheHttpClient,我已经读到它支持Gzip开箱即用,但是我找不到任何关于如何做我需要的事情的例子。如果有人能发一些这样的例子,我将不胜感激。您需要先将字符串转换为gzip字节[]或(temp)文件。让我们假设它不是一个非常大的字符串值,因此字节[]对于可用的JVM内存来说足够安全: String foo = "value"; ByteArrayOutputStream baos = new Byte

我需要向web服务器发送一个POST请求,其中包含一个gzip请求参数。我正在使用ApacheHttpClient,我已经读到它支持Gzip开箱即用,但是我找不到任何关于如何做我需要的事情的例子。如果有人能发一些这样的例子,我将不胜感激。

您需要先将
字符串
转换为gzip
字节[]
或(temp)
文件。让我们假设它不是一个非常大的
字符串
值,因此
字节[]
对于可用的JVM内存来说足够安全:

String foo = "value";
ByteArrayOutputStream baos = new ByteArrayOutputStream();

try (GZIPOutputStream gzos = new GZIPOutputStream(baos)) {
    gzos.write(foo.getBytes("UTF-8"));
}

byte[] fooGzippedBytes = baos.toByteArray();
然后,您可以使用HttpClient将其作为多部分正文发送,如下所示:

MultipartEntity entity = new MultipartEntity();
entity.addPart("foo", new InputStreamBody(new ByteArrayInputStream(fooGzippedBytes), "foo.txt"));

HttpPost post = new HttpPost("http://example.com/some");
post.setEntity(entity);

HttpClient client = new DefaultHttpClient();
HttpResponse response = client.execute(post);
// ...
entity.addPart("foo", new ByteArrayBody(fooGzippedBytes, "foo.txt"));
请注意,HttpClient 4.1支持新的,可按如下方式使用:

MultipartEntity entity = new MultipartEntity();
entity.addPart("foo", new InputStreamBody(new ByteArrayInputStream(fooGzippedBytes), "foo.txt"));

HttpPost post = new HttpPost("http://example.com/some");
post.setEntity(entity);

HttpClient client = new DefaultHttpClient();
HttpResponse response = client.execute(post);
// ...
entity.addPart("foo", new ByteArrayBody(fooGzippedBytes, "foo.txt"));

你能说得更具体些吗?“gzip字符串”到底是什么?gzip请求参数?还是Gzip请求主体?您的服务器是否支持gzip请求?(并非所有人都这么做…)您正在阅读的HttpClient透明GZIP支持涉及HTTP响应,而不是HTTP请求。哦,HTTPLib和HttpClient是不同的库…我已经编辑了我的问题。我指的是HttpClient和gzip请求参数。谢谢。只是一个gzip参数,而不是整个请求体?你怎么寄?作为Base64编码参数值还是作为
多部分/表单数据
部分?您确定目标服务器可以处理此问题吗?服务器到底期望什么?或者服务器代码也在您的完全控制之下?这将是
多部分/表单数据请求的一部分。服务器需要一个gzip参数。在使用WebView时也可以这样做吗?如果假设数据
POST
ed具有巨大的潜力,那么如何使用HTTPClient实现呢?我目前在低VM堆(16MB)设备上有
内存不足的问题。这是一个很好的答案,但我仍然要抱怨一行操作如何使用最标准的Java库获取20行代码。@HGPB您需要启用多部分的分块请求。这将避免抛出内存。