有没有一种很好的方法来实现“阻塞”请求拦截器?
主要思想是应该拦截所有请求并添加额外的标头 - token
。
如果token
尚不存在,则应首先检索它,然后将其添加到该请求并缓存以供将来使用。token
通过 API 调用检索。
我试图做同步请求,但是,这会产生android.os.NetworkOnMainThreadException
. 并且用in_progress
标志实现它看起来并不好。
您已经可以使用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);
}
);
好吧,您已经实现了“阻塞”拦截器,您的问题是 android 不允许您通过网络调用阻塞主线程。
您可能应该将改造调用包装在一个服务类中,该服务类异步调用您的 getToken 方法,并且仅在第一个成功完成时才发出“主”请求。
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);
}