Retrofit callback ottenere corpo risposta

? Kerwan @ | Original: StackOverFlow
---

Sto testando retrofit per confrontarlo con volley e sto lottando per ottenere la risposta da mie richieste .

Per esempio faccio qualcosa di simile a questo :

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

        }
    });

Funziona, l'oggetto toto è impostato, ma per testare fine, voglio anche visualizzare il rendimento risposta JSON dal server .

Così sto cercando di leggere il InputStream da response.getBody ( ), che è una TypedInputStream . Purtroppo, ho sempre arrivare un IOException : flusso è chiuso

Ho cercato di usare la classe Utils di retrofit ma ottengo lo stesso errore IOException : https://github.com/square/retrofit/blob/master/retrofit/src/main/java/retrofit/Utils.java

---

Top 5 Risposta

1Nitesh Khatri @

All'interno parentesi angolari di callback scrivono " Response" e quindi estrarre il flusso da questa risposta .

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 @

Recentemente ho incontrato un problema simile . Volevo guardare alcuni JSON nel corpo della risposta, ma non volevo affrontare il TypedByteArray da Retrofit . Ho trovato il modo più rapido per spostarsi era di fare una Pojo ( Plain Old Java Object) con un singolo campo String . Più in generale si dovrebbe fare una Pojo con un campo corrispondente a qualsiasi dato che si voleva guardare .

Ad esempio, dire che stavo facendo una richiesta in cui la risposta dal server era una singola stringa nel corpo della risposta chiamata " access_token "

Il mio Pojo sarebbe simile a questa :

public class AccessToken{
    String accessToken;

    public AccessToken() {}

    public String getAccessToken() {
        return accessToken;
    }
} 

e poi il mio richiamo sarebbe simile a questa

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

Questo vi permetterà di guardare a ciò che si è ricevuto nella risposta .

3droppin_science @

Se si imposta .setLogLevel(RestAdapter.LogLevel.FULL) sul RestAdapter che si utilizza per creare il servizio si dovrebbe ottenere la prima uscita risposta JSON nella console di debug .

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

mService = restAdapter.create(MyService.class);

Se si vuole fare qualcosa di diverso con questa risposta crudo è comunque possibile utilizzare il codice che avete nel vostro blocco successo per creare una stringa JSON ipotizzando di mantenere il LogLevel.FULL nel metodo setLogLevel, se non allora non lo farà analizzare il InputStream da response.getBody().in(), come è già stato letto e chiuse .