2014-10-14 12 views
6

Sto cercando di migrare il mio progetto Android a OkHttp.OkHttp gzip post body

Quello che mi chiedo è se OkHttp comprimerà il corpo delle mie richieste POST con gzip?

Io lo utilizzo come questo (dall'esempio sulla home page):

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

sarà questo RequestBody gzip in realtà il JSON se è "abbastanza grande", o devo farlo manualmente? Come ho fatto prima con AndroidHttpClient come questo:

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

Se ho bisogno di farlo manualmente, qual è l'approccio migliore?

Grazie!

risposta

10

Secondo questioni GitHub per OkHttp, dobbiamo farlo manualmente:

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

"Per il momento la soluzione migliore è di farlo manualmente: comprimere il contenuto e aggiungere Content-Encoding: gzip ".

Ecco come lo sto facendo ora:

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

ho preso il codice dal AndroidHttpClient da qui, e solo usando in linea senza la 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