2014-10-14 16 views
6

Tôi đang cố di chuyển dự án Android của mình đến OkHttp.OkHttp gzip post body

Điều tôi thắc mắc là nếu OkHttp sẽ nén nội dung yêu cầu POST của tôi bằng gzip?

Tôi đang sử dụng nó như thế này (từ ví dụ trên trang chủ):

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

sẽ RequestBody này thực sự gzip các json nếu đó là "đủ lớn", hay tôi cần phải làm điều này bằng tay? Giống như tôi đã làm trước đây với AndroidHttpClient như thế này:

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

Nếu tôi cần làm điều đó theo cách thủ công, cách tiếp cận tốt nhất là gì?

Cảm ơn bạn!

Trả lời

10

Theo vấn đề GitHub cho OkHttp, chúng ta nên làm điều đó bằng tay:

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

"Đối với thời điểm hiện tại lựa chọn tốt nhất của bạn là để làm điều đó bằng tay: nén các nội dung và thêm Content-Encoding: gzip . "

Đây là cách tôi đang làm bây giờ:

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(); 

tôi lấy mã từ AndroidHttpClient từ đây, và chỉ sử dụng nó inline mà không 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

Các vấn đề liên quan