使用Retrofit阻止请求拦截器?

时间:2014-02-25 14:09:49

标签: android retrofit

有没有一种很好的方法来实现“阻塞”请求拦截器?

主要想法是应截取所有请求并添加其他标头 - token

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

我尝试过同步请求,但产生android.os.NetworkOnMainThreadException。使用in_progress标志实现它看起来不太好。

3 个答案:

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