Я использую модификацию для получения данных из Интернета. Теперь моя проблема в том, что я должен получить файл gziped, и для модернизации требуется какой-то заголовок, который я не знаю, как реализовать право, очевидно. Я сделал исследование по этому вопросу, но ничего не помогает, поскольку большинство разработчиков используют json.
Вот что я пытаюсь сделать:
Retrofit retrofit = new Retrofit.Builder() .baseUrl("this is my baseurl") .addConverterFactory(SimpleXmlConverterFactory.create()) .build();
И мой интерфейс:
public interface RestAPI { @GET("main_data1.gz") Call<Meritum> getData(); @GET("terms1_EN.gz") Call<MeritumTerms> getTerms(); @GET Call<GameResults> getResults(@Url String url); }
Поэтому я пытаюсь получить этот gziped файл, и я всегда получаю ответ вроде этого:
Итак, что мне нужно добавить, чтобы retrofit распознал этот файл gzip?
Вы не должны указывать какие-либо заголовки.
Я построил мини-сервер, который просто отвечает на следующие XML-файлы:
<task> <id link="http://url-to-link.com/task-id">1</id> <title>Retrofit XML Converter Blog Post</title> <description>Write blog post: XML Converter with Retrofit</description> <language>de-de</language> </task>
После запуска сервера я могу получить XML с помощью curl
:
curl http://localhost:1337/ -v --compressed
Я правильно вижу XML и сервер отвечает следующими заголовками:
Content-Encoding: gzip Content-Type: application/xml; charset=utf-8
Зная, что сервер отвечает gzip-ответом, теперь я пытаюсь заставить его работать в Android:
Я использую следующее в build.gradle
:
compile 'com.squareup.retrofit2:retrofit:2.1.0' compile ('com.squareup.retrofit2:converter-simplexml:2.1.0') { exclude group: 'xpp3', module: 'xpp3' exclude group: 'stax', module: 'stax-api' exclude group: 'stax', module: 'stax' }
Это конфигурация модифицированного экземпляра:
Retrofit retrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(SimpleXmlConverterFactory.create()) .build();
Это интерфейс:
public interface MyApiEndpointInterface { @GET("/") Call<Task> getInfo(); }
Это мой класс Task
:
@Root(name = "task") public class Task { @Element(name = "id") private long id; @Element(name = "title") private String title; @Element(name = "description") private String description; @Element(name = "language") private String language; @Override public String toString() { return "Task{" + "id=" + id + ", title='" + title + '\'' + ", description='" + description + '\'' + ", language='" + language + '\'' + '}'; } }
Я могу подтвердить, что он работает, выполняя следующие действия:
call.enqueue(new Callback<Task>() { @Override public void onResponse(Call<Task> call, Response<Task> response) { if (response.isSuccessful()) { Log.d("MainActivity", response.body() + ""); ...
Если у some1 else есть эта проблема, он может ссылаться на ссылку ниже, которая сработала для меня
Модернизация: как разобрать ответ GZIP'd без Content-Encoding: заголовок gzip