Дооснащение + OkHttp + GZIP-ed JSON

Я новичок в Retrofit, но кажется очень мощным. Все работает нормально с обычным JSON, но как только я попробую GZIPed, я просто получаю сообщение об ошибке:

I / System.out (14883): —— retrofit.RetrofitError: retrofit.converter.ConversionException: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: ожидается BEGIN_OBJECT, но был STRING в строке 1 столбца 1

Очевидно, что символы тарабарщины, которые я вижу в журнале, не могут быть проанализированы как JSON.

Я думал, что okHttp это уловка, что gzip материал правильно? Что мне не хватает?

Эти банки находятся в моей папке libs:

retrofit-1.6.1.jar okhttp-2.0.0.jar gson-2.2.4.jar 

Таким образом я начинаю звонок:

 public interface OvlService { @GET("/gziptest.gz") void getOvls(Callback<OvlWrapper> callback); } ... OkHttpClient okHttpClient = new OkHttpClient(); Executor executor = Executors.newCachedThreadPool(); RestAdapter restAdapter = new RestAdapter.Builder() .setEndpoint("http://my.domain") // The base API endpoint. .setLogLevel(RestAdapter.LogLevel.FULL) .setExecutors(executor, executor) .setClient(new OkClient(okHttpClient)) .build(); OvlService ovlService = restAdapter.create(OvlService.class); ovlService.getOvls(new Callback<OvlWrapper>() { @Override public void success(OvlWrapper arg0, Response arg1) { System.out.println("result: " + arg0.toString()); } }); 

result: -line никогда не отображается, но вместо этого я вижу много таких вещей T = Mk A G 4. @ A в RetrofitLog. Что я делаю неправильно, что gzip не распаковывается? Благодаря!

Редактировать:

Я попробовал это с файлом gzip на моем тестовом сервере ( server.com/ovl.gz ), и я также попробовал его с исходным сервером api ( server2.com/api.php?id=ovlgzip ). Тот же результат, но разные заголовки:

Контрольный сервер:

 HTTP/1.1 200 OK Accept-Ranges: bytes Connection: close Content-Length: 477 Content-Type: application/x-gzip ETag: "2cc40cb-1dd-..." Last-Modified: Tue, 08 Jul 2014 17:00:08 GMT OkHttp-Received-Millis: 1404950522590 OkHttp-Response-Source: NETWORK 200 OkHttp-Selected-Transport: http/1.1 OkHttp-Sent-Millis: 1404950522533 Server: Apache              } Qk 0   ... 

Исходный сервер:

 HTTP/1.1 200 OK Connection: Keep-Alive Content-Type: application/json Keep-Alive: timeout=4, max=1000 OkHttp-Received-Millis: 1404950697627 OkHttp-Response-Source: NETWORK 200 OkHttp-Selected-Transport: http/1.1 OkHttp-Sent-Millis: 1404950697002 Server: Apache Transfer-Encoding: chunked X-Powered-By: PHP/5.3.3-7+squeeze19              } Qk 0   ... 

Благодаря комментарию Джейка Уортонса оказалось, что Content-Encoding: gzip заголовок Content-Encoding: gzip отсутствует. Поскольку я сказал серверу добавить эти заголовки, все работает нормально:

 <?php $data = ...; $gzdata = gzencode($data, 9, FORCE_GZIP); header('Content-Encoding: gzip'); header('Content-Length: '.strlen($gzdata)); ... ?> 

Если вы загружаете gzip- файл с расширением .gz , вы используете apache, и у вас включен mod_mime . Затем вы можете добавить эту директиву в virtualhost или в файл .htaccess:

 AddEncoding gzip .gz 

Таким образом, когда вы запрашиваете файл с расширением .gz, apache автоматически добавляет заголовок «Content-Encoding: gzip» в ответ (вывод файла), а okhttp автоматически расшифровывает тело ответа .

Intereting Posts
Почему мое приложение для Android, предназначенное для распространения в одной стране, загружается несколькими? Напишите дополнительный класс Parcelable для другого участка Cordova + ionic + crosswalk = net :: ERR_INSECURE_RESPONSE INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES при установке приложения в первый раз Приложение для Android несколько раз подряд падает ColorEffect не отображается на камере предварительного просмотра Имеет ли фрагмент с каждым действием хорошую практику (на базе Android Studio)? Android Nexus 7 Jelly Bean: startPreview / takePicture, вызывающий getCameraStereoMode регистрирует ошибку EditText не будет обертывать текст Как сделать противоположность атрибута предпочтения android: зависимость? Android программно получает данные для конкретного приложения, например: Использование данных, используемых в «Facebook», Отключение SearchView Отключить ActionBar RTL Direction Как сделать масштабируемый LinearLayout? Включение externalNativeBuild с разделом ABI