2014-02-25 105 views
3

有没有一种很好的方式来实现“阻塞”请求拦截器?使用Retrofit阻止请求拦截器?

主要思想是所有的请求都应该被拦截并添加额外的头部 - token

如果token不存在,则应先检索它,然后添加到该请求中并缓存以备将来使用。通过API调用获取token

我试过做同步请求,但是,那产生了android.os.NetworkOnMainThreadException。并用in_progress标志执行它看起来不太好。

回答

1

那么,你已经实现了你的'拦截'拦截器,你的问题是android不会让你用网络调用阻塞主线程。

您应该将您的翻新调用包装在一个服务类中,该类可以异步调用您的getToken方法,并且仅在第一个请求成功完成时发出“主要”请求。

2

您可以使用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); 
     } 
); 
+0

是的,我正在寻找一个解决方案,以便没有请求可以被执行,除非令牌被提取。对于这个拦截器,委派这个工作似乎是个好主意。 –

+1

我的第一个请求(成功登录后)我得到我的令牌如何获取该令牌并将其保存到变量? – feresr

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); 
}