Android 改装-全球拦截响应

Android 改装-全球拦截响应,android,retrofit,okhttp,Android,Retrofit,Okhttp,我想截取改装引擎接收到的所有响应,并扫描HTTP错误代码,例如错误403 我知道我可以使用每个请求的失败(错误)回调并检查403,但我想全局包装响应 我可以看到请求拦截是可能的,但我看不到类似的响应选项 有什么建议吗?我可以通过向改造使用的OkHttpClient添加拦截器来实现这一点 Kotlin+改装2.x val clientBuilder = OkHttpClient.Builder() clientBuilder.addInterceptor { chain ->

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

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

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


有什么建议吗?

我可以通过向改造使用的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));

另一种可能是重写改装的
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);
OkClient客户端=新的OkClient(okHttpClient){
@凌驾
public reformation.client.Response execute(reformation.client.Request请求)引发IOException{
reformation.client.Response=super.execute(请求);
//对“响应”执行任何操作,例如查找特定标题的值:
List headers=response.getHeaders();
用于(改装.client.Header标题:标题){
if(MY_HEADER.equalsIgnoreCase(HEADER.getName())){
this.savedValue=header.getValue();
打破
}
}
返回响应;
}
};
RestAdapter.Builder restAdapterBuilder=新建RestAdapter.Builder()
.setEndpoint(API_BASE_URL)
.setClient(客户);

正如您在上面的代码片段中所看到的,
okhttp3.Response=chain.continue(请求)行访问服务器响应。因此,我们可以使用
if(response.code()==500)
检查状态代码,然后打开
ServerisBrokerActivity

你能解释一下我应该为ActivityFragmentInteraction支持什么吗我想知道doStuff()可能会做什么,因为这是一个后台线程。什么是restadapter这是改装1.x,我将更新改装2的答案:)有没有办法调用改装API调用程序的onFailure()?[据我所知,此“处理”与改型API调用本身无关]
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();