【问题标题】:Blocking request interceptor with Retrofit?用改造阻止请求拦截器?
【发布时间】:2014-03-27 19:42:39
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: android retrofit


    【解决方案1】:

    您已经可以使用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);
           }
    );
    

    【讨论】:

    • 是的,我正在寻找一种解决方案,以便除非获取令牌,否则无法执行任何请求。将这项工作委派给这个拦截器似乎是个好主意。
    • 我在第一次请求(成功登录)后获得了我的令牌,我将如何获取该令牌并将其保存到变量中?
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      从 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);
      }
      

      【讨论】:

        猜你喜欢
        • 2014-10-17
        • 2021-11-02
        • 1970-01-01
        • 1970-01-01
        • 2020-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-01
        相关资源
        最近更新 更多