我正在测试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中的Utils类,但我得到了相同的IOException
错误。
答案 0 :(得分:52)
内部回调的尖括号写入“响应”,然后从此响应中提取流。
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) {
}
});
答案 1 :(得分:29)
在改造2.0之前
String bodyString = new String(((TypedByteArray) response.getBody()).getBytes());
改造2.0
String bodyString = new String(response.body().bytes());
答案 2 :(得分:23)
如果在用于创建服务的.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
方法中,如果没有,则它不会解析来自response.getBody().in()
的InputStream,因为它已被读取并关闭。
答案 3 :(得分:3)
我最近遇到了类似的问题。我想在响应体中查看一些json但是不想处理来自Retrofit的TypedByteArray。我发现解决它的最快方法是使用单个String字段创建Pojo(Plain Old Java Object)。更一般地说,您可以创建一个Pojo,其中一个字段对应于您想要查看的任何数据。
例如,假设我正在发出请求,其中来自服务器的响应是响应正文中的单个字符串,名为&#34; access_token&#34;
我的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());
}
};
这将使您能够查看响应中收到的内容。
答案 4 :(得分:3)
请不要为此使用stream和straemReaders。 使用像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;
}
答案 5 :(得分:1)
另一个解决方案是执行以下操作:
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);
}
}
答案 6 :(得分:1)
对于2.1.0版,您可以将内容作为
public void onResponse(Call<T> call, Response<T> response) {
String errorString = response.errorBody().string();
}
答案 7 :(得分:0)
就这样做:
ModelClass modelclass=response.response.body()
System.out.println("****************-----retro rsp----1-------"+modelclass.getMessage());
答案 8 :(得分:-1)
在您的响应模型中按cmd + n并覆盖&#34; toString&#34;方法,只调用response.toString();
@Override
public String toString() {
return "{" +
"key_one='" + var_keyone + '\'' +
", key_two='" + var_keytwo + '\'' +
'}';
}