有没有实现“阻塞”请求拦截器的好方法?
主要思想是所有请求都应该被拦截,并添加额外的header - token。
如果token还不存在,则应该首先检索它,然后将其添加到该请求中并缓存以供将来使用。通过接口调用获取token。
我试着做同步请求,但是,这会产生android.os.NetworkOnMainThreadException。并且使用in_progress标志来实现它看起来并不好。
发布于 2014-04-13 21:38:47
你已经可以使用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);
       }
);发布于 2014-03-06 23:54:47
好吧,你已经实现了你的“阻塞”拦截器,你的问题是android不允许你用网络调用阻塞主线程。
您可能应该将改进调用包装在一个服务类中,该服务类异步地调用您的getToken方法,并且仅当第一个请求成功完成时才发出“main”请求。
发布于 2015-02-05 03:06:17
从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);
}https://stackoverflow.com/questions/22016657
复制相似问题