2016-02-22 13 views
7

Câu hỏi: Làm cách nào để thêm proxy ủy quyền vào OkHTTP.Xác thực proxy OkHTTPClient làm cách nào?

Tôi biết rằng công cụ xây dựng của OkHTTP does support proxies mặc dù tôi đang gặp khó khăn trong việc thiết lập.

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

Tôi có IP/cổng/tên người dùng/mật khẩu.

Mặc dù tôi không biết cách biến chúng thành một số Proxy proxy mà sau đó có thể được sử dụng trong ứng dụng khách.SetProxy().

Có vẻ như quá phức tạp và tôi dường như không thể hiểu được. Bất kỳ trợ giúp sẽ được đánh giá cao.

Trả lời

18

Hãy thử điều này:

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

Nó dường như không xác thực proxy. Tôi đã quản lý để làm cho nó hoạt động với một dòng lệnh 'curl -x user: passS @ proxy: cổng address' với những chi tiết này mặc dù aove của bạn dường như không xác thực. Tôi nhận được thông báo lỗi 'Truy cập bị từ chối (authentication_failed)' – Liably

+0

Mã phản hồi HTTP nào? Với trình xác thực proxy OkHttp sẽ thử lại để xác thực lại proxy trước khi hiển thị lỗi đó cho người gọi. –

+1

Đối với tôi cũng không hoạt động. Tôi luôn nhận được Yêu cầu xác thực proxy 407 trở lại. Và curl đang làm việc. – Robinho

Các vấn đề liên quan