2015-04-05 73 views
7

根据OKHttp文档,我使用OkHttp 2.3以及基本身份验证请求,它会自动重试未经身份验证的请求,但每当我提供无效凭据时,请求会花费太多时间,最后我会得到此异常:在Okhttp中处理身份验证

java.net.ProtocolException:太多的后续请求:21

如何防止OkHttp从自动重试身份认证的请求,并返回401 Unauthorized呢?

回答

9
protected Authenticator getBasicAuth(final String username, final String password) { 
    return new Authenticator() { 
     private int mCounter = 0; 

     @Override 
     public Request authenticate(Proxy proxy, Response response) throws IOException { 
      if (mCounter++ > 0) { 
       throw new AuthenticationException(
         AuthenticationException.Type.INVALID_LOGIN, response.message()); 
      } 

      String credential = Credentials.basic(username, password); 
      return response.request().newBuilder().header("Authorization", credential).build(); 
     } 

     @Override 
     public Request authenticateProxy(Proxy proxy, Response response) throws IOException { 
      return null; 
     } 
    }; 
} 

在我的身份验证器中,我简单地计算了尝试 - 在X尝试后,我抛出一个异常。

+0

非常感谢,这就是我最终做的事情,没有什么可以禁用Okhttp迄今为止发现的多个试验。 – 2015-04-17 13:42:33

1

修改Traxdata的回答版本的作品:

protected Authenticator getBasicAuth(final String username, final String password) { 
    return new Authenticator() { 
     private int mCounter = 0; 

     @Override 
     public Request authenticate(Route route, Response response) throws IOException { 
      Log.d("OkHttp", "authenticate(Route route, Response response) | mCounter = " + mCounter); 
      if (mCounter++ > 0) { 
       Log.d("OkHttp", "authenticate(Route route, Response response) | I'll return null"); 
       return null; 
      } else { 
       Log.d("OkHttp", "authenticate(Route route, Response response) | This is first time, I'll try to authenticate"); 
       String credential = Credentials.basic(username, password); 
       return response.request().newBuilder().header("Authorization", credential).build(); 
      } 
     } 
    }; 
} 

然后,你需要:

OkHttpClient.Builder builder = new OkHttpClient.Builder(); 
builder.authenticator(getBasicAuth("username", "pass")); 
retrofit = new Retrofit.Builder() 
      .baseUrl(BASE_URL) 
      .client(builder.build()) 
      .addConverterFactory(GsonConverterFactory.create()) 
      .build(); 

就是这样。