有没有一种很好的方式来实现“阻塞”请求拦截器?使用Retrofit阻止请求拦截器?
主要思想是所有的请求都应该被拦截并添加额外的头部 - token
。
如果token
不存在,则应先检索它,然后添加到该请求中并缓存以备将来使用。通过API调用获取token
。
我试过做同步请求,但是,那产生了android.os.NetworkOnMainThreadException
。并用in_progress
标志执行它看起来不太好。
有没有一种很好的方式来实现“阻塞”请求拦截器?使用Retrofit阻止请求拦截器?
主要思想是所有的请求都应该被拦截并添加额外的头部 - token
。
如果token
不存在,则应先检索它,然后添加到该请求中并缓存以备将来使用。通过API调用获取token
。
我试过做同步请求,但是,那产生了android.os.NetworkOnMainThreadException
。并用in_progress
标志执行它看起来不太好。
那么,你已经实现了你的'拦截'拦截器,你的问题是android不会让你用网络调用阻塞主线程。
您应该将您的翻新调用包装在一个服务类中,该类可以异步调用您的getToken方法,并且仅在第一个请求成功完成时发出“主要”请求。
您可以使用RequestInterceptor来执行此操作的'截取'部分。只需使用RestAdapter.Builder.setRequestInterceptor()
。
虽然它不打算这样做,但是从RequestInterceptor外部的API中检索令牌是个好主意。在第一次通话之后,您只需在RequestInterceptor.intercept()
内的任意位置添加令牌即可。
事情是这样的:
Builder builder = new RestAdapter.Builder()
//Set Endpoint URL, Retrofit class... etc
.setRequestInterceptor(new RequestInterceptor() {
@Override
public void intercept(RequestFacade request) {
String authToken = getAuthToken(); //Not included here, retrieve the token.
request.addHeader("Authorization", "Bearer " + authToken);
}
);
截至OkHTTP 2.2,你现在可以添加网络上的线程中运行拦截器:
https://github.com/square/okhttp/wiki/Interceptors
一个例子拦截器,用于添加身份验证令牌可能像这样;
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
// Get your auth token by going out over the network..
// add authorization header, defaulting to the original request.
Request authedRequest = request;
if (!TextUtils.isEmpty(authToken)) {
authedRequest = request.newBuilder().addHeader("Auth", authToken).build();
}
return chain.proceed(authedRequest);
}
是的,我正在寻找一个解决方案,以便没有请求可以被执行,除非令牌被提取。对于这个拦截器,委派这个工作似乎是个好主意。 –
我的第一个请求(成功登录后)我得到我的令牌如何获取该令牌并将其保存到变量? – feresr