有没有一种很好的方法来实现“阻塞”请求拦截器?
主要想法是应截取所有请求并添加其他标头 - token
。
如果token
尚不存在,则应首先检索它,然后将其添加到该请求并缓存以供将来使用。通过API调用检索token
。
我尝试过同步请求,但产生android.os.NetworkOnMainThreadException
。使用in_progress
标志实现它看起来不太好。
答案 0 :(得分:2)
你已经可以进行拦截了#39;部分内容使用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);
}
);
答案 1 :(得分:1)
好吧,你已经实现了你的'阻塞'拦截器,你的问题是android不会让你用网络调用阻塞主线程。
您可能应该将改进调用包装在一个异步调用getToken方法的服务类中,并且仅在第一个请求成功完成时才生成'main'请求。
答案 2 :(得分:1)
从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);
}