Как я могу использовать прокси Socks5 в Okhttp для запуска HTTP-запроса

Как я могу использовать прокси Socks5 в Okhttp для запуска HTTP-запроса?

Мой код:

Proxy proxy = new Proxy(Proxy.Type.SOCKS, InetSocketAddress.createUnresolved(
        "socks5host", 80));
OkHttpClient client = new OkHttpClient.Builder()
       .proxy(proxy).authenticator(new Authenticator() {
            @Override
            public Request authenticate(Route route, Response response) throws IOException {
                if (HttpUtils.responseCount(response) >= 3) {
                    return null;
                }
                String credential = Credentials.basic("user", "psw");
                if (credential.equals(response.request().header("Authorization"))) {
                    return null; // If we already failed with these credentials, don't retry.
                }
                return response.request().newBuilder().header("Authorization", credential).build();
            }
        }).build();


Request request = new Request.Builder().url("http://google.com").get().build();
Response response = client.newCall(request).execute();  <--- **Here, always throw java.net.UnknownHostException: Host is unresolved: google.com**

System.out.println(response.body().string());

Как избежать исключения UnknownHostException? Любой пример?

Спасибо!


person zzz zzz    schedule 13.10.2016    source источник


Ответы (2)


Я нашел решение: при создании OkHttpClient.Builder () установите новый socketFactory вместо set proxy и верните прокси sock5 внутри socketFactory createSocket.

person zzz zzz    schedule 14.10.2016

Думаю, это самый простой способ работы. Но мне кажется, что это не может быть на 100% безопасным. Я взял этот код из этого кода отсюда и изменил его, потому что RequestorType моего прокси - SERVER. На самом деле у java есть странный api для прокси, вы должны установить auth для прокси через системный env (вы можете увидеть это по той же ссылке)

final int proxyPort = 1080; //your proxy port
final String proxyHost = "your proxy host";
final String username = "proxy username";
final String password = "proxy password";

InetSocketAddress proxyAddr = new InetSocketAddress(proxyHost, proxyPort);
Proxy proxy = new Proxy(Proxy.Type.SOCKS, proxyAddr);

Authenticator.setDefault(new Authenticator() {
  @Override
  protected PasswordAuthentication getPasswordAuthentication() {
    if (getRequestingHost().equalsIgnoreCase(proxyHost)) {
      if (proxyPort == getRequestingPort()) {
        return new PasswordAuthentication(username, password.toCharArray());
      }
    }
    return null;
  }
});


OkHttpClient client = new OkHttpClient.Builder()
        .proxy(proxy)
        .build();
person Eugene Kortov    schedule 03.06.2019