2016-02-22 34 views
7

Domanda: Come aggiungere un proxy di autorizzazione a OkHTTP.OkHTTPClient Proxy autenticazione come?

So che il costruttore di OkHTTP does support proxies anche se ho difficoltà a installarne uno.

/** 
* 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"; 
    } 

Ho l'IP/porta/nome utente/password.

Anche se non so come trasformarli in uno Proxy proxy che può quindi essere utilizzato in client.SetProxy().

Sembra eccessivamente complicato e semplicemente non riesco a capirlo. Qualsiasi aiuto sarebbe apprezzato.

risposta

18

Prova questo:

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

Non sembra per autenticare il proxy. Sono riuscito a farlo funzionare con una riga di comando 'curl -x utente: passS @ proxy: port address' con questi dettagli sebbene il tuo aove non sembra autenticarsi. Viene visualizzato il messaggio di errore 'Accesso negato (authentication_failed)' – Liably

+0

Quale codice di risposta HTTP? Con l'autenticatore proxy, OkHttp dovrebbe riprovare a riautenticare il proxy prima di emettere quell'errore al chiamante. –

+1

Anche per me non funziona. Ricevo sempre il 407 proxy di autenticazione richiesto. E il ricciolo sta funzionando. – Robinho

Problemi correlati