OkHttp 压缩 POST 请求体

8

我正在尝试将我的Android项目迁移到OkHttp

我想知道的是,OkHttp是否会使用gzip压缩我的POST请求主体?

我像这样使用它(来自首页的示例):

RequestBody body = RequestBody.create(JSON, json);
Request request = new Request.Builder()
        .url(url)
        .post(body)
        .build();

如果json数据足够大,那么这个RequestBody会自动gzip压缩吗?还是我需要手动进行压缩呢?就像我之前使用AndroidHttpClient做的那样:

AndroidHttpClient.getCompressedEntity(json, context.getContentResolver())

如果需要手动完成,最好的方法是什么?
谢谢!
2个回答

14
根据OkHttp的GitHub问题,我们应该手动完成此操作:

https://github.com/square/okhttp/issues/350

"目前最好的选择是手动压缩内容并添加Content-Encoding: gzip."

以下是我现在的做法:

byte[] data = json.getBytes("UTF-8");
ByteArrayOutputStream arr = new ByteArrayOutputStream();
OutputStream zipper = new GZIPOutputStream(arr);
zipper.write(data);
zipper.close();

RequestBody body = RequestBody.create(JSON, arr.toByteArray());
Request request = new Request.Builder()
        .url(url)
        .post(body)
        .header("Content-Encoding", "gzip")
        .build();

我从这里的AndroidHttpClient中获取了代码,并且直接在内联中使用它,而不使用ByteArrayEntity: http://grepcode.com/file/repo1.maven.org/maven2/org.robolectric/android-all/4.2.2_r1.2-robolectric-0/android/net/http/AndroidHttpClient.java#AndroidHttpClient.getCompressedEntity%28byte%5B%5D%2Candroid.content.ContentResolver%29

1

虽然已经晚了,但如果未来有人需要,以下是一种更简单的方法:

按照以下步骤进行操作:

val request = Request.Builder().url("…")\ .addHeader("Content-Encoding", "gzip")\ .post(uncompressedBody.gzip())\ .build()

更多详细信息可在这里找到。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接