首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带Retrofit的拦截请求程序?

带Retrofit的拦截请求程序?
EN

Stack Overflow用户
提问于 2014-02-25 22:09:49
回答 3查看 6.3K关注 0票数 4

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

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

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

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

EN

回答 3

Stack Overflow用户

发布于 2014-04-13 21:38:47

你已经可以使用RequestInterceptor来完成“拦截”部分了。只需使用RestAdapter.Builder.setRequestInterceptor()即可。

不过,更好的做法是从RequestInterceptor外部的API中检索令牌,因为它并不打算这样做。在第一次调用之后,您只需将令牌添加到RequestInterceptor.intercept()内请求中的任何位置。

如下所示:

代码语言:javascript
运行
复制
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);
       }
);
票数 2
EN

Stack Overflow用户

发布于 2014-03-06 23:54:47

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

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

票数 1
EN

Stack Overflow用户

发布于 2015-02-05 03:06:17

从OkHTTP 2.2开始,您现在可以添加在网络线程上运行的拦截器:

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

添加身份验证令牌的拦截器示例可能如下所示;

代码语言:javascript
运行
复制
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);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22016657

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档