web-dev-qa-db-ja.com

レトロフィットコールバック取得応答本文

私はRetrofitをテストしてVolleyと比較し、リクエストからの応答を得るのに苦労しています。たとえば、次のようなことをします。

_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) {}
    });
_

動作し、オブジェクトtotoが設定されていますが、テスト目的のために、サーバーから返されたJSON応答も表示したいと思います。

だから、InputStreamであるresponse.getBody()からTypedInputStreamを読み取ろうとしています。残念ながら、私は常に_IOException : Stream is closed_を取得します。

Retrofitの tils クラスを使用しようとしましたが、同じIOExceptionエラーが発生します。

45
Kerwan

コールバックの山括弧内に「Response」と記述し、この応答からストリームを抽出します。

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

    }
});
52
Nitesh Khatri

Retrofit 2.0より前

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

Retrofit 2.

 String  bodyString = new String(response.body().bytes());
29
shiami

サービスの作成に使用するRestAdapter.setLogLevel(RestAdapter.LogLevel.FULL)を設定した場合、デバッグコンソールで生のJSON応答出力を取得する必要があります。

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

mService = restAdapter.create(MyService.class);
_

この生の応答で何か別のことをしたい場合は、setLogLevelメソッドに_LogLevel.FULL_を保持すると仮定して、成功ブロックにあるコードを使用してJSON文字列を作成できます既に読み込まれて閉じられているため、response.getBody().in()からのInputStreamを解析しません。

23
droppin_science

私は最近、同様の問題に遭遇しました。応答本文のjsonを見たいと思っていましたが、RetrofitのTypedByteArrayを扱いたくありませんでした。それを回避する最も簡単な方法は、単一の文字列フィールドでPojo(Plain Old Java Object)を作成することでした。より一般的には、どんなデータにも対応する1つのフィールドで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());
   }
};

これにより、応答で受け取ったものを確認できます。

3

これにはストリームとstraemReaderを使用しないでください。 squareのようなスマートなソリューションを使用してください:

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

例:

private String getResponseBody(Response response) {
    String result = "";
    //Try to get response body
    if (response.getBody() instanceof TypedByteArray) {
        TypedByteArray b = (TypedByteArray) response.getBody();
        result = new String(b.getBytes());
    }
    return result;
}
3
Kirill Vashilo

別の解決策は、次のようなことをすることです。

  private static String bodyAsString(RequestBody body) {
    try {
      Buffer buffer = new Buffer();
      body.writeTo(buffer);
      return buffer.readString(body.contentType().charset());
    } catch (IOException e) {
      throw new RuntimeException(e);
    }
  }

https://github.com/square/okhttp/blob/master/okcurl/src/test/Java/com/squareup/okhttp/curl/MainTest.Java#L93-L101 から取得

1
loeschg

バージョン2.1.0では、コンテンツを次のように取得できます。

public void onResponse(Call<T> call, Response<T> response) {
    String errorString = response.errorBody().string();
}
1
Ravi Selvaraj

このようにしてください:

ModelClass modelclass=response.response.body()
System.out.println("****************-----retro rsp----1-------"+modelclass.getMessage());
0
Nishanth S Babu