改进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) 

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; } 

另一个解决办法是做如下的事情:

  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

在版本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 + '\'' + '}'; }