46

我正在测试 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 响应。

所以我试图InputStreamresponse.getBody()which is a中读取TypedInputStream。不幸的是,我总是得到一个IOException : Stream is closed.

我尝试使用 Retrofit 中的Utils类,但我得到了同样的IOException错误。

4

9 回答 9

53

在回调的尖括号内写入“响应”,然后从该响应中提取流。

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) {

    }
});
于 2014-05-25T11:02:53.213 回答
29

改造 2.0 之前

   String bodyString = new String(((TypedByteArray) response.getBody()).getBytes());

改造 2.0

 String  bodyString = new String(response.body().bytes());
于 2015-06-06T15:44:54.457 回答
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不会解析 InputStreamresponse.getBody().in()已经阅读并关闭。

于 2014-09-10T13:40:33.327 回答
3

我最近遇到了类似的问题。我想查看响应正文中的一些 json,但不想处理 Retrofit 中的 TypedByteArray。我发现解决它的最快方法是制作一个带有单个字符串字段的 Pojo(普通旧 Java 对象)。更一般地,您会制作一个 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());
   }
};

这将使您能够查看您在响应中收到的内容。

于 2014-08-22T22:02:00.433 回答
3

请不要为此使用流和 straemReaders。使用像 square 这样的智能解决方案:

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;
}
于 2016-06-03T11:57:56.753 回答
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);
    }
  }

取自https://github.com/square/okhttp/blob/master/okcurl/src/test/java/com/squareup/okhttp/curl/MainTest.java#L93-L101

于 2015-02-25T17:03:05.700 回答
1

使用 2.1.0 版本,您可以获得的内容为

public void onResponse(Call<T> call, Response<T> response) {
    String errorString = response.errorBody().string();
}
于 2016-10-13T17:58:05.777 回答
0

这样做:

ModelClass modelclass=response.response.body()
System.out.println("****************-----retro rsp----1-------"+modelclass.getMessage());
于 2017-04-21T13:01:11.713 回答
-1

在您的响应模型中按 cmd+n 并覆盖“toString”方法,并且仅调用 response.toString();

@Override
public String toString() {
    return "{" +
            "key_one='" + var_keyone + '\'' +
            ", key_two='" + var_keytwo + '\'' +
            '}';
}
于 2016-06-22T03:22:55.453 回答