Как преобразовать успешное тело ответа в конкретный тип с помощью модификации?

В режиме асинхронного режима переадресация вызовов

public void success(T t, Response rawResponse)

были t - преобразованный ответ, а rawResponse - это сырой ответ. Это дает вам доступ как к необработанному ответу, так и к преобразованному ответу.

В режиме синхронизации вы можете получить либо преобразованный ответ ИЛИ необработанный ответ

преобразованный ответ

@GET("/users/list")
List<User> userList();

необработанный ответ

@GET("/users/list")
Response userList();

У объекта Response есть способ получить тело

TypedInput  getBody()

а у модифицированного api есть класс преобразователя, который может преобразовать его в объект java

Object fromBody(TypedInput body,Type type)

Но я не могу понять, как получить экземпляр объекта Converter

Я мог бы создать экземпляр класса Converter, но для этого потребуется знание объекта Gson, используемого для создания RestAdapter, к которому у меня может не быть доступа. В идеале я хотел бы получить ссылку на объект конвертера непосредственно на RestAdpater.


Любое из следующего ответит на мой вопрос:

  • Есть ли способ получить ссылку на конвертер по умолчанию, используемый для модификации?
  • Кто-нибудь знает, как сконфигурирован конвертер по умолчанию? (нет конструктора по умолчанию и есть два конструктора public GsonConverter(Gson gson) и общедоступный GsonConverter (Gson gson, String charset)
  • Есть ли другой способ получить как необработанный, так и преобразованный ответ в режиме синхронизации?

Ответ 1

Вот пример класса StringConverter, который реализует Converter, найденный в модификации. В основном вам придется переопределить fromBody() и сказать, что вы хотите.

public class StringConverter implements Converter {

    /*
     * In default cases Retrofit calls on GSON which expects a JSON which gives
     * us the following error, com.google.gson.JsonSyntaxException:
     * java.lang.IllegalStateException: Expected BEGIN_OBJECT but was
     * BEGIN_ARRAY at line x column x
     */

    @Override
    public Object fromBody(TypedInput typedInput, Type type)
            throws ConversionException {

        String text = null;
        try {
            text = fromStream(typedInput.in());
        } catch (IOException e) {
            e.printStackTrace();
        }
        return text;
    }

    @Override
    public TypedOutput toBody(Object o) {
        return null;
    }

    // Custom method to convert stream from request to string
    public static String fromStream(InputStream in) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(in));
        StringBuilder out = new StringBuilder();
        String newLine = System.getProperty("line.separator");
        String line;
        while ((line = reader.readLine()) != null) {
            out.append(line);
            out.append(newLine);
        }
        return out.toString();
    }
}

Применив это к вашему запросу, вам нужно будет сделать следующее:

// initializing Retrofit rest adapter
RestAdapter restAdapter = new RestAdapter.Builder()
        .setEndpoint(ApiConstants.MAIN_URL).setLogLevel(LogLevel.FULL)
        .setConverter(new StringConverter()).build();