2016-02-22 12 views
7

Frage: Wie füge ich einen Authorization Proxy zu OkHTTP hinzu.OkHTTPClient Proxy-Authentifizierung, wie?

Ich weiß, dass OkHTTP Builder does support proxies, obwohl ich eine harte Zeit habe, eine aufzustellen.

/** 
* Given a Url and a base64 encoded password return the contents of a website. 
* @param urlString 
* @param password 
* @return JSON 
*/ 
public String getURLJson(String urlString, String password) {  
     OkHttpClient client = new OkHttpClient.Builder() 
       .connectTimeout(60, TimeUnit.SECONDS) 
       .writeTimeout(60, TimeUnit.SECONDS) 
       .readTimeout(60, TimeUnit.SECONDS) 
       .build(); 

     Request request = new Request.Builder() 
      .url(urlString) 
      .get() 
      .addHeader("authorization", "Basic " + password) 
      .addHeader("cache-control", "no-cache") 
      .build(); 

     Response response = null; 
     try { 
      response = client.newCall(request).execute(); 
      String string = response.body().string(); 
      response.body().close(); 
      return string; 
     } catch (IOException e) { 
      System.err.println("Failed scraping"); 
      e.printStackTrace(); 
     } 
     return "failed"; 
    } 

Ich habe die IP/Port/Benutzername/Passwort.

Obwohl ich nicht weiß, wie man diese in eine Proxy proxy macht, die dann in client.SetProxy() verwendet werden kann.

Es scheint übermäßig kompliziert und ich kann einfach nicht scheinen, es herauszufinden. Jede Hilfe wäre willkommen.

Antwort

18

Versuchen Sie folgendes:

int proxyPort = 8080; 
String proxyHost = "proxyHost"; 
final String username = "username"; 
final String password = "password"; 

Authenticator proxyAuthenticator = new Authenticator() { 
    @Override public Request authenticate(Route route, Response response) throws IOException { 
     String credential = Credentials.basic(username, password); 
     return response.request().newBuilder() 
      .header("Proxy-Authorization", credential) 
      .build(); 
    } 
}; 

OkHttpClient client = new OkHttpClient.Builder() 
    .connectTimeout(60, TimeUnit.SECONDS) 
    .writeTimeout(60, TimeUnit.SECONDS) 
    .readTimeout(60, TimeUnit.SECONDS) 
    .proxy(new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHost, proxyPort))) 
    .proxyAuthenticator(proxyAuthenticator) 
    .build(); 
+0

Es ist nicht die Proxy zu authentifizieren scheint. Ich habe es geschafft, es mit einer Befehlszeile 'curl -x user: passS @ proxy: port address' mit diesen Details arbeiten, obwohl Ihre aove scheint nicht zu authentifizieren. Ich bekomme die Fehlermeldung 'Zugriff verweigert (authentication_failed)' – Liably

+0

Welcher HTTP-Antwortcode? Mit dem Proxy-Authentifikator sollte OkHttp versuchen, den Proxy erneut zu authentifizieren, bevor dieser Fehler dem Aufrufer angezeigt wird. –

+1

Für mich funktioniert auch nicht. Ich bekomme immer die Rückgabe 407 Proxy Authentication Required. Und die Locken arbeiten. – Robinho