【问题标题】:Retrofit get Response body in failure(RetrofitError error) - async call改造获取响应体失败(RetrofitError 错误) - 异步调用
【发布时间】:2016-03-05 03:17:14
【问题描述】:

我在一个大型项目中使用 Retrofit 1.9,即使调用失败,也必须检查响应标头中的一些数据 - 例如分析请求代码。我们已经知道异步调用的结构:

    RestClient.get().asyncRequest(requestParams, new Callback<GenericResponse>() {
        @Override
        public void success(MyPojo pojo, Response response) {
         //we can use pojo object or use whole response

        }

        @Override
        public void failure(RetrofitError error) {
         //we can handle only error but NOT response

        }
    });

我们如何在这两种情况下分析响应?

一种解决方案是在创建RestAdapter 时使用Profiler,例如:

     RestAdapter restAdapter = new RestAdapter.Builder()

           //other stuff

            .setProfiler(new Profiler() {
                @Override
                public Object beforeCall() {
                    return null;
                }        

                @Override
                public void afterCall(RequestInformation requestInfo, long elapsedTime, int statusCode, Object beforeCallData) {
                  //get what I need
                    }
                })
                .build();

但也许有另一种解决方案可以在failure() 方法中获得响应。任何建议都将不胜感激!

【问题讨论】:

    标签: android retrofit


    【解决方案1】:

    您可以从RetrofitError 获取响应正文。

          @Override
            public void failure(RetrofitError error) {
    
             //here you get your response
              Response response = error.getResponse();
    
             //use data from response
             int code = response.getStatus();
             List<Header> =  response.getHeaders();
             // ...
    
            }
    

    【讨论】:

    • 是的,由你决定如何使用它
    【解决方案2】:

    我想这会解决你的问题

     RestAdapter restAdapter = new RestAdapter.Builder()
    
               //other stuff
    
                .setProfiler(new Profiler() {
                    @Override
                    public Object beforeCall() {
                        return null;
                    }        
    
                    @Override
                    public void afterCall(RequestInformation requestInfo, long elapsedTime, int statusCode, Object beforeCallData) {
                      //get what I need
                        }
                    })
                     .setLogLevel(RestAdapter.LogLevel.FULL).build();
    

    现在你可以得到响应了

    public void failure(RetrofitError error) {
      String json =  new String(((TypedByteArray)error.getResponse().getBody()).getBytes());
        Log.v("failure", json.toString());
     }
    

    【讨论】:

    • 我有这个 - 它只适用于日志,但如果我需要在调用 failure() 方法时以某种方式处理响应? )
    【解决方案3】:

    retrofit 中的failure 方法只告诉发生了错误,如果想查看您可以检查retrofit 中的error 方法的参数,或者如果您想在失败时再次调用,您可以再次调用该服务。

    【讨论】:

      猜你喜欢
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 2019-12-12
      • 2014-12-17
      • 1970-01-01
      • 1970-01-01
      • 2018-01-29
      • 1970-01-01
      相关资源
      最近更新 更多