4

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

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

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

我试图做同步请求,但是,这会产生android.os.NetworkOnMainThreadException. 并且用in_progress标志实现它看起来并不好。

4

3 回答 3

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);
       }
);
于 2014-04-13T13:38:47.183 回答
1

好吧,您已经实现了“阻塞”拦截器,您的问题是 android 不允许您通过网络调用阻塞主线程。

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

于 2014-03-06T15:54:47.097 回答
1

As of OkHTTP 2.2, you can now add interceptors that run on the network thread:

https://github.com/square/okhttp/wiki/Interceptors

An example interceptor for adding an auth token might be like this;

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);
}
于 2015-02-04T19:06:17.487 回答