Skip to content Skip to sidebar Skip to footer

Retrofit Callback Get Response Body

I am testing Retrofit to compare it with Volley and I am struggling to get the response from my requests. For example, I do something like this: RestAdapter restAdapter = new RestA

Solution 1:

Inside callback's angle brackets write "Response" and then extract the stream from this response.

service.getToto("toto", newCallback<Response>() {
    @Overridepublicvoidsuccess(Response result, Response response) {

        //Try to get response bodyBufferedReader reader = null;
        StringBuilder sb = newStringBuilder();
        try {

            reader = newBufferedReader(newInputStreamReader(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();
    }

    @Overridepublicvoidfailure(RetrofitError error) {

    }
});

Solution 2:

Before Retrofit 2.0

String bodyString = newString(((TypedByteArray) response.getBody()).getBytes());

Retrofit 2.0

String  bodyString = newString(response.body().bytes());

Solution 3:

If you set .setLogLevel(RestAdapter.LogLevel.FULL) on the RestAdapter that you use to create the service you should get the raw JSON response output in the debug console.

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

mService = restAdapter.create(MyService.class);

If you want to do something different with this raw response you can still use the code you have in your success block to create a JSON string assuming that you keep the LogLevel.FULL in the setLogLevel method, if not then it won't parse the InputStream from response.getBody().in() as it's already been read and closed.

Solution 4:

I recently encountered a similar problem. I wanted to look at some json in the response body but didn't want to deal with the TypedByteArray from Retrofit. I found the quickest way to get around it was to make a Pojo(Plain Old Java Object) with a single String field. More Generally you would make a Pojo with one field corresponding to whatever data you wanted to look at.

For example, say I was making a request in which the response from the server was a single string in the response's body called "access_token"

My Pojo would look like this:

publicclassAccessToken{
    String accessToken;

    publicAccessToken() {}

    public String getAccessToken() {
        return accessToken;
    }
} 

and then my callback would look like this

Callback<AccessToken> callback = newCallback<AccessToken>() {
   @Overridepublicvoidsuccess(AccessToken accessToken, Response response) {
       Log.d(TAG,"access token: "+ accessToken.getAccessToken());
   }

   @Overridepublicvoidfailure(RetrofitError error) {
       Log.E(TAG,"error: "+ error.toString());
   }
};

This will enable you to look at what you received in the response.

Solution 5:

Please, don't use streams and straemReaders for this. Use smart solutions like square does:

private Response logAndReplaceResponse(String url, Response response, long elapsedTime)

http://www.programcreek.com/java-api-examples/index.php?source_dir=retrofit-jaxrs-master/retrofit/src/main/java/retrofit/RestAdapter.java

example:

privateStringgetResponseBody(Response response) {
    String result = "";
    //Try to get response bodyif (response.getBody() instanceofTypedByteArray) {
        TypedByteArray b = (TypedByteArray) response.getBody();
        result = newString(b.getBytes());
    }
    return result;
}

Post a Comment for "Retrofit Callback Get Response Body"