Retrofit Rückruf erhalten Antwort Körper

? Kerwan @ | Original: StackOverFlow
---

Ich teste Nachrüstung mit volley vergleichen, und ich bin kämpfen, um die Antwort auf meine Wünsche zu bekommen.

Zum Beispiel ich tun, so etwas wie dieses :

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

        }
    });

Es funktioniert, das Objekt toto eingestellt ist, aber zu Testzwecken, ich will auch die JSON Antwort Rückkehr vom Server anzuzeigen.

Also ich versuche, um die Input von response.getBody (lesen ), die eine TypedInputStream ist . Leider bekomme ich immer eine IOException : Stream ist geschlossen

Ich versuchte, die Utils -Klasse von Nachrüst verwenden, aber ich bekomme die gleiche IOException Fehler: https://github.com/square/retrofit/blob/master/retrofit/src/main/java/retrofit/Utils.java

---

Top 5 Antwort

1Nitesh Khatri @

Innerhalb spitzen Klammern Rückruf zu schreiben "Reaktion" und extrahieren Sie dann den Strom aus dieser Antwort.

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 @

Vor kurzem habe ich ein ähnliches Problem aufgetreten . Ich wollte irgend json in der Antworttext aussehen, aber wollte nicht mit dem TypedByteArray von Retrofit umzugehen. Ich fand die schnellste Weg, um um ihn herum war es, eine Pojo ( Plain Old Java Object) mit einem einzelnen String-Feld zu machen. Mehr Generell würde eine Pojo mit einem Feld entsprechend alle Daten, die Sie ansehen wollten zu machen.

Zum Beispiel, sagen, ich war ein Ersuchen, in dem die Antwort des Servers war eine einzelne Zeichenfolge im Hauptteil der Antwort als " access_token "

Meine Pojo würde wie folgt aussehen :

public class AccessToken{
    String accessToken;

    public AccessToken() {}

    public String getAccessToken() {
        return accessToken;
    }
} 

und dann meine Rückruf würde wie folgt aussehen

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

Dies ermöglicht es Ihnen, auf was Sie in der Antwort erhalten suchen.

3droppin_science @

Wenn Sie .setLogLevel(RestAdapter.LogLevel.FULL) auf dem RestAdapter, mit dem Sie den Service sollten Sie den rohen JSON Antwort Ausgabe im Debug-Konsole zu bekommen erstellen.

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

mService = restAdapter.create(MyService.class);

Wenn Sie etwas anderes mit diesem rohen Antwort können Sie immer noch den Code Sie verwenden in Ihren Erfolg Block ein JSON-String vorausgesetzt, Sie halten zu schaffen machen wollen die LogLevel.FULL im setLogLevel Methode, wenn nicht, dann wird es nicht analysieren Sie die Inputstream von response.getBody().in(), wie es bereits gelesen und geschlossen.