2016-08-03 31 views
2

Derzeit meine Client-Anfrage auf Fall von 401-Antwort nur authentifiziert:aktiviert Authenticator manuell

this.client.authenticator(new okhttp3.Authenticator() { 

     public Request authenticate(Route route, Response response) throws IOException { 
     String credentials = authenticator.getCredentials(); 
     if (credentials.equals(response.request().header("Authorization"))) { 
      throw new TraversonException(401, "Unauthorized", response.request().url().toString()); 
     } else { 
      defaultHeader("Authorization", credentials); 

      Request.Builder newRequest = response.request().newBuilder() 
           .headers(Headers.of(defaultHeaders)); 

      return newRequest.build(); 
     } 
}); 

Aber ich möchte dieses Verhalten ändern und in der Lage sein, es zu nennen entweder manuell oder automatisch per ersten Anruf? Ist es irgendwie möglich?

Antwort

2

Wenn die Authentifizierung erwartungsgemäß erforderlich ist und nicht mit einem Proxy verknüpft ist, besteht die Lösung darin, einen Interceptor anstelle von Authenticator zu implementieren.

OkHttpClient.Builder clientBuilder = ...; 
clientBuilder.networkInterceptors().add(0, myInterceptor); 
client = clientBuilder.build(); 

Beispiel Interceptor https://github.com/yschimke/oksocial/blob/master/src/main/java/com/baulsupp/oksocial/authenticator/ServiceInterceptor.java

N.B. Es gibt Diskussionen über mögliche Unterstützung für diesen Anwendungsfall in https://github.com/square/okhttp/pull/2458. Ein Problem mit der aktuellen Authenticator API besteht darin, dass es eine Antwort von der fehlgeschlagenen (401) Anfrage annimmt.

+0

Wir hoffen auch, die präemptive Authentifizierung in einer zukünftigen Version zu implementieren. –