【问题标题】:Retrofit - Intercept responses globally改造 - 全局拦截响应
【发布时间】:2023-04-01 08:08:02
【问题描述】:

我想拦截改造引擎收到的所有响应,并扫描 HTTP 错误代码,例如错误 403。

我知道我可以使用每个请求的失败(RetrofitError 错误)回调并检查 403,但我想全局包装响应。

我可以看到请求拦截是可能的,但我没有看到类似的响应选项。

有什么建议吗?

【问题讨论】:

    标签: android retrofit okhttp


    【解决方案1】:

    我能够通过向改造正在使用的 OkHttpClient 添加一个拦截器来实现这一点。

    Kotlin + 改造 2.x

    val clientBuilder = OkHttpClient.Builder()
    clientBuilder.addInterceptor { chain ->
                val request = chain.request()
                val response = chain.proceed(request)
                if (response.code() == 403) {
                    handleForbiddenResponse()
                }
                response
            }
    

    改造 2.x:

       OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder();
       clientBuilder.
                addInterceptor(new Interceptor() {
                    @Override
                    public Response intercept(Chain chain) throws IOException {
                       Request request = chain.request();
                       Response response = chain.proceed(request);
                       if (response.code() == 403) {
                             handleForbiddenResponse();
                       }
                       return response;
                    }
                });
    
    
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(API_BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .client(clientBuilder.build();)
                .build();
    

    改造 1.x:

    public class ForbiddenInterceptor implements Interceptor {
    
        @Override
        public Response intercept(Chain chain) throws IOException {
            Request request = chain.request();
            Response response = chain.proceed(request);
            if (response.code() == 403) {
                 handleForbiddenResponse();
            }
            return response;
        }
    }
    
    
    
    OkHttpClient okHttpClient = Utils.createUnsafeOkHttpClient();
    okHttpClient.interceptors().add(new ForbiddenInterceptor());
    
    RestAdapter.Builder restAdapterBuilder = new RestAdapter.Builder()
            .setEndpoint(API_BASE_URL)
            .setClient(new OkClient(okHttpClient));
    

    【讨论】:

    • 你能解释一下我应该为 ActivityFragmentInteraction 使用什么
    • 我很想知道 doStuff() 可能会做什么,因为这是一个后台线程。
    • 什么是RestAdapter
    • 这是改造 1.x,我会更新改造 2 的答案 :)
    • 有什么方法可以调用 Retrofit API 调用者的 onFailure()? [我理解这个“处理”与 Retrofit API 调用本身是分离的]
    【解决方案2】:

    另一种可能性是覆盖 Retrofit 的 OkClient 中的 execute 方法。就我而言,我正在寻找一个特定的响应头,所以它是这样的:

    OkClient client = new OkClient(okHttpClient) {
        @Override
        public retrofit.client.Response execute(retrofit.client.Request request) throws IOException {
            retrofit.client.Response response = super.execute(request);
    
            // Do whatever with 'response', such as looking for the value of a particular header:
    
            List<retrofit.client.Header> headers = response.getHeaders();
            for (retrofit.client.Header header : headers) {
                if (MY_HEADER.equalsIgnoreCase(header.getName())) {
                    this.savedValue = header.getValue();
                    break;
                }
            }
    
            return response;
        }
    };
    
    RestAdapter.Builder restAdapterBuilder = new RestAdapter.Builder()
            .setEndpoint(API_BASE_URL)
            .setClient(client);
    

    【讨论】:

      【解决方案3】:
      OkHttpClient okHttpClient = new OkHttpClient.Builder()  
          .addInterceptor(new Interceptor() {
              @Override
              public okhttp3.Response intercept(Chain chain) throws IOException {
                  Request request = chain.request();
                  okhttp3.Response response = chain.proceed(request);
      
                  // todo deal with the issues the way you need to
                  if (response.code() == 500) {
                      startActivity(
                              new Intent(
                                      ErrorHandlingActivity.this,
                                      ServerIsBrokenActivity.class
                              )
                      );
      
                      return response;
                  }
      
                  return response;
              }
          })
          .build();
      
      Retrofit.Builder builder = new Retrofit.Builder()  
              .baseUrl("http://your_url")
              .client(okHttpClient)
              .addConverterFactory(GsonConverterFactory.create());
      
      Retrofit retrofit = builder.build(); 
      

      正如您在上面的 sn-p 中看到的,okhttp3.Response response = chain.proceed(request); 行访问服务器响应。因此,我们可以用if (response.code() == 500)查看状态码,然后打开ServerIsBrokenActivity

      【讨论】:

        猜你喜欢
        • 2016-05-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-23
        • 2020-06-29
        • 2023-03-28
        相关资源
        最近更新 更多