Модернизация обратного вызова получить тело ответа

? Kerwan @ | Original: StackOverFlow
---

Я проверяю модернизацию, чтобы сравнить его с градом и я борюсь, чтобы получить ответ от моих запросов.

Например, я делаю что-то вроде этого:

RestAdapter restAdapter = new RestAdapter.Builder()
            .setEndpoint("http://localhost:8080")
            .build();

MyService service = restAdapter.create(MyService.class);
service.getToto("toto", new Callback<Toto>() {
        @Override
        public void success(Toto toto, Response response) {

            //Try to get response body
            BufferedReader reader = null;
            StringBuilder sb = new StringBuilder();
            try {

                reader = new BufferedReader(new InputStreamReader(response.getBody().in()));

                String line;

                try {
                    while ((line = reader.readLine()) != null) {
                        sb.append(line);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }


            String result = sb.toString();
        }

        @Override
        public void failure(RetrofitError error) {

        }
    });

Это работает,объект Тото установлен, но в целях тестирования, я также хочу, чтобы отобразить обратного ответа JSON на сервере.

Так я пытаюсь читать InputStream из response.getBody ( ), который являетсяTypedInputStream . К сожалению, я всегда получаю IOException : поток закрыт

Я пытался использовать класс Utils от модификации, но я получаю ту же ошибку IOException : https://github.com/square/retrofit/blob/master/retrofit/src/main/java/retrofit/Utils.java

---

Top 5 ответ

1Nitesh Khatri @

Внутри угловые скобки CallBack пишут «ответ», а затем извлечь поток от этого ответа .

service.getToto("toto", new Callback<Response>() {
    @Override
    public void success(Response result, Response response) {

        //Try to get response body
        BufferedReader reader = null;
        StringBuilder sb = new StringBuilder();
        try {

            reader = new BufferedReader(new InputStreamReader(result.getBody().in()));

            String line;

            try {
                while ((line = reader.readLine()) != null) {
                    sb.append(line);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }


        String result = sb.toString();
    }

    @Override
    public void failure(RetrofitError error) {

    }
});
2Michael Alan Huff @

Недавно я столкнулся с подобной проблемой . Я хотел посмотреть на какой-то JSON в теле ответа, но не хотят иметь дело с TypedByteArray от модернизации. Я нашел самый быстрый способ, чтобы обойти это сделать Pojo ( Plain Old Java Object) с одного поля String. Более правило, вы бы сделать Pojo с одного поля, соответствующие данные, которые вы хотели посмотреть.

Например, сказать, что я делал запросы, в которыхответ от сервера былиодной строки в теле ответ сервлета называется " access_token "

Мой Pojo будет выглядеть следующим образом :

public class AccessToken{
    String accessToken;

    public AccessToken() {}

    public String getAccessToken() {
        return accessToken;
    }
} 

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

Callback<AccessToken> callback = new Callback<AccessToken>() {
   @Override
   public void success(AccessToken accessToken, Response response) {
       Log.d(TAG,"access token: "+ accessToken.getAccessToken());
   }

   @Override
   public void failure(RetrofitError error) {
       Log.E(TAG,"error: "+ error.toString());
   }
};

Это позволит вам взглянуть на то, что вы получили в ответ .

3droppin_science @

Если вы установите .setLogLevel(RestAdapter.LogLevel.FULL) наRestAdapter, который используется для создания службы, вы должны получить прямой вывод JSON ответ в консоли отладки .

RestAdapter restAdapter = new RestAdapter.Builder()
    .setServer("http://my_lovely_api.com")
    .setLogLevel(RestAdapter.LogLevel.FULL)
    .build();

mService = restAdapter.create(MyService.class);

Если вы хотите сделать что-то другое с этого сырья ответ вы все еще можете использовать код, который вы имеете в своем успехе блока для созданияJSON строку при условии, что вы держитеLogLevel.FULL в методе setLogLevel, если нет, то это не будет разобрать InputStream от response.getBody().in(), как это уже было прочитано и закрытые.