Восстановить обратный вызов
Я тестирую 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
.
Я попытался использовать класс Utils из Retrofit, но получаю ту же ошибку IOException
.
Ответы
Ответ 1
Внутри скобки угла обратного вызова записывается "Ответ", а затем извлекается поток из этого ответа.
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) {
}
});
Ответ 2
До повторной установки 2.0
String bodyString = new String(((TypedByteArray) response.getBody()).getBytes());
Дооснащение 2.0
String bodyString = new String(response.body().bytes());
Ответ 3
Если вы установили .setLogLevel(RestAdapter.LogLevel.FULL)
в RestAdapter
, который вы используете для создания службы, вы должны получить исходный ответ JSON в консоли отладки.
RestAdapter restAdapter = new RestAdapter.Builder()
.setServer("http://my_lovely_api.com")
.setLogLevel(RestAdapter.LogLevel.FULL)
.build();
mService = restAdapter.create(MyService.class);
Если вы хотите сделать что-то другое с этим сырым ответом, вы все равно можете использовать код, который у вас есть в своем блоке успеха, чтобы создать строку JSON, предполагая, что вы сохраняете LogLevel.FULL
в методе setLogLevel
, если не тогда не будет анализировать InputStream из response.getBody().in()
, поскольку он уже был прочитан и закрыт.
Ответ 4
Недавно я столкнулся с подобной проблемой. Я хотел посмотреть на json в теле ответа, но не хотел иметь дело с TypedByteArray от Retrofit. Я нашел самый быстрый способ обойти это, чтобы создать Pojo (обычный старый объект Java) с одним строковым полем. Более того, вы бы сделали Pojo с одним полем, соответствующим любым данным, которые вы хотели посмотреть.
Например, скажем, я делал запрос, в котором ответ с сервера был одной строкой в теле ответа, называемой "access_token"
My 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());
}
};
Это позволит вам посмотреть, что вы получили в ответ.
Ответ 5
Пожалуйста, не используйте для этого потоки и straemReaders.
Используйте интеллектуальные решения, например, квадрат:
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;
}
Ответ 6
Другим решением было бы сделать что-то вроде следующего:
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
Ответ 7
С версией 2.1.0 вы можете получить контент как
public void onResponse(Call<T> call, Response<T> response) {
String errorString = response.errorBody().string();
}
Ответ 8
Просто сделайте это так:
ModelClass modelclass=response.response.body()
System.out.println("****************-----retro rsp----1-------"+modelclass.getMessage());
Ответ 9
в вашей модели ответа нажмите cmd + n и переопределите метод toString и вызовите только response.toString();
@Override
public String toString() {
return "{" +
"key_one='" + var_keyone + '\'' +
", key_two='" + var_keytwo + '\'' +
'}';
}