Pozwól mi spoiler tego. Możesz przechwycić żądanie i odpowiedź od OkHttp-2.2. Tak jak w przypadku OkHttp wiki, interceptory nie będą działały w Retrofit
z OkUrlFactory
. Trzeba zapewnić implementację Client
wykonać Retrofit
wnioski na temat tego custom Client i jest bezpośrednio na OkHttp
Niestety, to nie jest się jeszcze (wkrótce).
public class ResponseHeaderInterceptor implements Interceptor {
public interface ResponseHeaderListener{
public void onHeadersIntercepted(Headers headers);
}
private ResponseHeaderListener mListener;
public ResponseHeaderInterceptor(){};
public ResponseHeaderInterceptor(ResponseHeaderListener listener){
mListener = listener;
}
@Override public Response intercept(Chain chain) throws IOException {
Response response = chain.proceed(chain.request());
if(mListener != null){
mListener.onHeadersIntercepted(response.headers());
}
return response;
}
Zastosowanie:
ResponseHeaderListener headerListener = new ResponseHeaderListener(){
@Override
public void onHeadersIntercepted(Headers headers){
//do stuff with headers
}
};
OkHttpClient okHttpClient = new OkHttpClient();
okHttpClient.interceptors().add(new ResponseHeaderInterceptor(headerListener));
RestAdapter.Builder restAdapterBuilder = new RestAdapter.Builder();
restAdapterBuilder.setClient(new OkHttpClient22(okHttpClient));
To przechwytujących aplikacji i zostanie wywołana tylko raz.
Proszę zauważyć, że zrobiłem to wszystko logicznie, nadal nie mam OkHttp-2.2. Przeczytaj o tym here. Usuwam część tego tekstu, gdy 2.2 jest najnowszym słojem.
Alternatywnie, można spróbować stworzyć własny klienta oraz z jednego interfejsu dostarczyć odpowiedź:
public class InterceptableClient extends OkClient {
private ResponseListener mListener;
public interface ResponseListener{
public void onResponseIntercepted(Response response);
}
public InterceptableClient(){};
public InterceptableClient(ResponseListener listener){
mListener = listener;
}
@Override
public retrofit.client.Response execute(Request request) throws IOException {
Response response = super.execute(request);
if(mListener != null) //runs on the executor you have provided for http execution
mListener.onResponseIntercepted(response);
return response;
}
}
Edit: OkHttp 2.2 został released.
Używanie tego typu obserwowalnego utrudnia dwa połączenia zip, przynajmniej z tego, co mogę powiedzieć. Czy jest jakiś inny sposób? – Brandon
o sprawdzaniu, czy odpowiedź zakończyła się pomyślnie() ?? – orium