私は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
エラーが発生します。
コールバックの山括弧内に「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) {
}
});
Retrofit 2.0より前
String bodyString = new String(((TypedByteArray) response.getBody()).getBytes());
Retrofit 2.
String bodyString = new String(response.body().bytes());
サービスの作成に使用する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を解析しません。
私は最近、同様の問題に遭遇しました。応答本文の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());
}
};
これにより、応答で受け取ったものを確認できます。
これにはストリームとstraemReaderを使用しないでください。 squareのようなスマートなソリューションを使用してください:
private Response logAndReplaceResponse(String url, Response response, long elapsedTime)
例:
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;
}
別の解決策は、次のようなことをすることです。
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);
}
}
バージョン2.1.0では、コンテンツを次のように取得できます。
public void onResponse(Call<T> call, Response<T> response) {
String errorString = response.errorBody().string();
}
このようにしてください:
ModelClass modelclass=response.response.body()
System.out.println("****************-----retro rsp----1-------"+modelclass.getMessage());