Retrofit callback obter resposta corpo

? Kerwan @ | Original: StackOverFlow
---

Estou testando retrofit para compará-lo com o vôlei e eu estou lutando para obter a resposta de meus pedidos .

Por exemplo, eu fazer algo assim :

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) {

        }
    });

Ele funciona, o objeto toto está definido, mas para testar propósito, eu também quero mostrar o retorno resposta JSON pelo servidor.

Então eu estou tentando ler o InputStream de response.getBody ( ) que é um TypedInputStream . Infelizmente, sempre recebo um IOException : Córrego está fechado

Eu tentei usar a classe Utils de retrofit, mas eu recebo o mesmo erro IOException : https://github.com/square/retrofit/blob/master/retrofit/src/main/java/retrofit/Utils.java

---

Top 5 Responder

1Nitesh Khatri @

Dentro de colchetes de retorno de chamada escrever "Resposta" e depois extrair o fluxo de esta resposta.

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 @

Eu recentemente encontrou um problema similar. Eu queria olhar para alguns json no corpo da resposta, mas não querem lidar com o TypedByteArray de Retrofit . Achei que a maneira mais rápida de obter em torno dele era fazer um Pojo ( Plain Old Java Object) com um campo de Cordas single. Mais Geralmente você faria um Pojo com um campo correspondente a todos os dados que você queria olhar.

Por exemplo, digamos que eu estava fazendo um pedido em que a resposta do servidor foi uma única corda no corpo da resposta chamado " access_token "

Meu Pojo ficaria assim :

public class AccessToken{
    String accessToken;

    public AccessToken() {}

    public String getAccessToken() {
        return accessToken;
    }
} 

e depois o meu callback ficaria assim

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

Isto irá permitir que você olhe para o que você recebeu na resposta.

3droppin_science @

Se definir .setLogLevel(RestAdapter.LogLevel.FULL) sobre o RestAdapter que você usa para criar o serviço que você deve obter o resultado bruto resposta JSON no console de depuração.

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

mService = restAdapter.create(MyService.class);

Se você quiser fazer algo diferente com esta resposta cru você ainda pode usar o código que você tem em seu bloco de sucesso para criar uma cadeia JSON assumindo que você mantenha o LogLevel.FULL no método setLogLevel, se não, então ele não vai analisar o InputStream de response.getBody().in(), uma vez que já foi lido e fechada.