改进callback获得响应正文
我正在testingRetrofit与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
,但出于testing目的,我也想显示服务器返回的JSON响应。
所以我正在尝试从TypedInputStream
response.getBody()
这是一个TypedInputStream
读取InputStream
。 不幸的是,我总是得到一个IOException : Stream is closed
。
我试图从Retrofit使用Utils类,但是我得到相同的IOException
错误。
在callback的尖括号内写入“Response”,然后从这个响应中提取stream。
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());
改造2.0
String bodyString = new String(response.body().bytes());
如果在用于创build服务的RestAdapter
上设置.setLogLevel(RestAdapter.LogLevel.FULL)
,则应该在debugging控制台中获取原始JSON响应输出。
RestAdapter restAdapter = new RestAdapter.Builder() .setServer("http://my_lovely_api.com") .setLogLevel(RestAdapter.LogLevel.FULL) .build(); mService = restAdapter.create(MyService.class);
如果你想对这个原始的响应做一些不同的事情,你仍然可以使用你的成功块中的代码来创build一个JSONstring,假设你在setLogLevel
方法中保留了LogLevel.FULL
,否则就不会parsingInput.getBody response.getBody().in()
InputStream,因为它已被读取和closures。
我最近遇到了类似的问题。 我想看看响应正文中的一些JSON,但不想处理来自Retrofit的TypedByteArray。 我发现最快捷的方法是用一个string字段来创build一个Pojo(普通的旧Java对象)。 更一般地说,你会做出一个Pojo,其中一个字段对应于你想查看的任何数据。
例如,假设我正在发出一个请求,其中来自服务器的响应是响应主体中的单个string,名为“access_token”
我的Pojo看起来像这样:
public class AccessToken{ String accessToken; public AccessToken() {} public String getAccessToken() { return accessToken; } }
然后我的callback看起来像这样
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()); } };
这将使您能够查看您在回复中收到的内容。
请不要使用stream和straemReaders这个。 使用智能解决scheme,如方形:
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());
在你的响应模型中,按下cmd + n并覆盖“toString”方法,只调用response.toString();
@Override public String toString() { return "{" + "key_one='" + var_keyone + '\'' + ", key_two='" + var_keytwo + '\'' + '}'; }