改造回调获得响应体

Ker*_*wan 45 android retrofit

我正在测试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) {}
    });
Run Code Online (Sandbox Code Playgroud)

它工作,对象toto已设置,但出于测试目的,我还想显示服务器返回的JSON响应.

所以,我想读的InputStream,从response.getBody()它是一个TypedInputStream.不幸的是,我总是得到一个IOException : Stream is closed.

我试图使用Retrofit 的Utils类,但是我得到了同样的IOException错误.

Nit*_*tri 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) {

    }
});
Run Code Online (Sandbox Code Playgroud)


shi*_*ami 29

在Retrofit 2.0之前

   String bodyString = new String(((TypedByteArray) response.getBody()).getBytes());
Run Code Online (Sandbox Code Playgroud)

改造2.0

 String  bodyString = new String(response.body().bytes());
Run Code Online (Sandbox Code Playgroud)

  • @Robert当我尝试这行代码时,我得到"无法解析方法'字节()'". (6认同)
  • 这个解决方案很棒,因为我可以使用我的响应类型并吃掉它. (5认同)
  • @shiami无法解析符号'TypedByteArray'.我在哪里可以上这门课? (3认同)
  • bodyString = new String(response.body().bytes()); for Retrofit 2.0 (3认同)

dro*_*nce 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);
Run Code Online (Sandbox Code Playgroud)

如果你想对这个原始响应做一些不同的事情,你仍然可以使用你在成功块中的代码来创建一个JSON字符串,假设你保留LogLevel.FULLsetLogLevel方法中,如果没有那么它就不会解析InputStream,response.getBody().in()因为它是已被阅读并关闭.