Alé*_*lho 1 android retrofit okhttp
我正在使用Retrofit及其大部分组件,如ErrorHandler,Callbacks和RequestInterceptor等.但我错过了像'ResponseInterceptor'这样的东西,它允许我以通用的方式过滤或读取响应中的标题,作为中心点,而不必为每个服务调用设置回调.这是目前我知道如何实现这一目标的唯一方法,但不得不在非常服务调用上显式传递回调对象.
我想要的是对任何存在特定标头的响应采取行动,因此它就像一个分析每个响应的通用对象('ResponseInterceptor').
有这样的事吗?或者更好的想法如何实现这一点,而无需在每个服务调用上设置一个Callback对象?
提前致谢!
由于改造目前不提供这样做的标准方法,我设法让它通过装饰工作retrofit.client.Client被赋予执行retrofit.RestAdapter,看到它下面:
1)定义拦截器的接口
import retrofit.client.Response;
public interface ResponseInterceptor {
void intercept(Response response);
}
Run Code Online (Sandbox Code Playgroud)
2)实现它.
public class MyResponseInterceptor implements ResponseInterceptor {
@Override
public void intercept(Response response) {
List<Header> headers = response.getHeaders();
//... read the headers the way you like
}
}
Run Code Online (Sandbox Code Playgroud)
3)为客户实现装饰器:
public final class ResponseInterceptorClient extends OkClient {
private final ResponseInterceptor responseInterceptor;
public ResponseInterceptorClient(OkHttpClient okHttpClient, ResponseInterceptor responseInterceptor) {
super(okHttpClient);
this.responseInterceptor = responseInterceptor;
}
@Override
public Response execute(Request request) throws IOException {
Response response = super.execute(request);
doIntercept(response);
return response;
}
private void doIntercept(Response response) {
if (responseInterceptor != null) {
responseInterceptor.intercept(response);
}
}
}
Run Code Online (Sandbox Code Playgroud)
4)然后将其传递给RestAdapter:
RestAdapter.Builder restBuilder = new RestAdapter.Builder();
//...
restBuilder.setClient(new ResponseInterceptorClient(okHttpClient, new MyResponseInterceptor()));
//...
restAdapter = restBuilder.build();
Run Code Online (Sandbox Code Playgroud)
它非常简单,它可以很容易地由库提供,就像RequestInterceptor一样,直到它不是,这是一种方法.请享用!
更新03/2016:由于Retrofit 2.0不需要创建自己的ResponseInterceptor,您可以使用与其集成的OkHttp拦截器.
| 归档时间: |
|
| 查看次数: |
349 次 |
| 最近记录: |