it-swarm.com.ru

Общий HTTPclient и прокси

Я использую общую библиотеку Apache httpclient. Можно ли сделать HTTP-запрос через прокси? Более конкретно, мне нужно использовать список прокси для многопоточных POST запросов (сейчас я тестирую однопоточные запросы GET).

Я пытался использовать:

        httpclient.getHostConfiguration().setProxy("67.177.104.230", 58720);

Я получаю ошибки с этим кодом:

21.03.2012. 20:49:17 org.Apache.commons.httpclient.HttpMethodDirector executeWithRetry
INFO: I/O exception (Java.net.ConnectException) caught when processing request: Connection refused: connect
21.03.2012. 20:49:17 org.Apache.commons.httpclient.HttpMethodDirector executeWithRetry
INFO: Retrying request
21.03.2012. 20:49:19 org.Apache.commons.httpclient.HttpMethodDirector executeWithRetry
INFO: I/O exception (Java.net.ConnectException) caught when processing request: Connection refused: connect
21.03.2012. 20:49:19 org.Apache.commons.httpclient.HttpMethodDirector executeWithRetry
INFO: Retrying request
21.03.2012. 20:49:21 org.Apache.commons.httpclient.HttpMethodDirector executeWithRetry
INFO: I/O exception (Java.net.ConnectException) caught when processing request: Connection refused: connect
21.03.2012. 20:49:21 org.Apache.commons.httpclient.HttpMethodDirector executeWithRetry
INFO: Retrying request
org.Apache.commons.httpclient.ProtocolException: The server xxxxx failed to respond with a valid HTTP response
    at org.Apache.commons.httpclient.HttpMethodBase.readStatusLine(HttpMethodBase.Java:1846)
    at org.Apache.commons.httpclient.HttpMethodBase.readResponse(HttpMethodBase.Java:1590)
    at org.Apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.Java:995)
    at org.Apache.commons.httpclient.ConnectMethod.execute(ConnectMethod.Java:144)
    at org.Apache.commons.httpclient.HttpMethodDirector.executeConnect(HttpMethodDirector.Java:495)
    at org.Apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.Java:390)
    at org.Apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.Java:170)
    at org.Apache.commons.httpclient.HttpClient.executeMethod(HttpClient.Java:396)
    at org.Apache.commons.httpclient.HttpClient.executeMethod(HttpClient.Java:324)
    at test.main(test.Java:42)

Когда я удаляю эту строку, все работает нормально, как и ожидалось.

20
dario111cro

Для httpclient 4.1.x вы можете установить прокси следующим образом (взято из в этом примере ):

    HttpHost proxy = new HttpHost("127.0.0.1", 8080, "http");

    DefaultHttpClient httpclient = new DefaultHttpClient();
    try {
        httpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy);

        HttpHost target = new HttpHost("issues.Apache.org", 443, "https");
        HttpGet req = new HttpGet("/");

        System.out.println("executing request to " + target + " via " + proxy);
        HttpResponse rsp = httpclient.execute(target, req);
        ...
    } finally {
        // When HttpClient instance is no longer needed,
        // shut down the connection manager to ensure
        // immediate deallocation of all system resources
        httpclient.getConnectionManager().shutdown();
    }
32
Kai Sternad

Вот как это сделать с последней версией HTTPClient (4.3.4)

    CloseableHttpClient httpclient = HttpClients.createDefault();
    try {
        HttpHost target = new HttpHost("localhost", 443, "https");
        HttpHost proxy = new HttpHost("127.0.0.1", 8080, "http");

        RequestConfig config = RequestConfig.custom()
                .setProxy(proxy)
                .build();
        HttpGet request = new HttpGet("/");
        request.setConfig(config);

        System.out.println("Executing request " + request.getRequestLine() + " to " + target + " via " + proxy);

        CloseableHttpResponse response = httpclient.execute(target, request);
        try {
            System.out.println("----------------------------------------");
            System.out.println(response.getStatusLine());
            EntityUtils.consume(response.getEntity());
        } finally {
            response.close();
        }
    } finally {
        httpclient.close();
    }
11
Michael Laffargue

Хотя этот вопрос очень старый, но я вижу все еще нет точного ответа. Я постараюсь ответить на вопрос здесь. 

Я считаю, что вкратце вопрос заключается в том, как установить параметры прокси для Apache HttpClient (org.Apache.commons.httpclient.HttpClient). 

Фрагмент кода ниже должен работать:

HttpClient client = new HttpClient();
HostConfiguration hostConfiguration = client.getHostConfiguration();
hostConfiguration.setProxy("localhost", 8080);
client.setHostConfiguration(hostConfiguration);
7
Santosh Singh

Начиная с Apache HTTPComponents 4.3.x класс HttpClientBuilder устанавливает параметры прокси по умолчанию в свойствах системы http.proxyHost и http.proxyPort, иначе вы можете переопределить их с помощью метода setProxy.

7
Dungeon Hunter

Вот как я решил эту проблему для старого (<4.3) HttpClient (который я не могу обновить), используя ответ Сантоша Сингха (которому я дал +1):

HttpClient httpclient = new HttpClient();
if (System.getProperty("http.proxyHost") != null) {
  try {
    HostConfiguration hostConfiguration = httpclient.getHostConfiguration();
    hostConfiguration.setProxy(System.getProperty("http.proxyHost"), Integer.parseInt(System.getProperty("http.proxyPort")));
    httpclient.setHostConfiguration(hostConfiguration);
    this.getLogger().warn("USING PROXY: "+httpclient.getHostConfiguration().getProxyHost());
  } catch (Exception e) {
    throw new ProcessingException("Cannot set proxy!", e);
  }
}
3
rakensi

У меня была похожая проблема с HttpClient версии 4.

Мне не удалось подключиться к серверу из-за ошибки прокси-сервера SOCKS, и я исправил это, используя следующую конфигурацию:

client.getParams().setParameter("socksProxyHost",proxyHost);
client.getParams().setParameter("socksProxyPort",proxyPort);
1
ttati

Если ваше программное обеспечение использует ProxySelector (например, для использования PAC-скрипта вместо статического хоста/порта) и ваши HTTPComponents версии 4.3 или выше, тогда вы можете использовать ProxySelector для вашей HttpClient, например так:

ProxySelector myProxySelector = ...;
HttpClient myHttpClient = HttpClientBuilder.create().setRoutePlanner(new SystemDefaultRoutePlanner(myProxySelector))).build();

А затем выполняйте ваши запросы как обычно:

HttpGet myRequest = new HttpGet("/");
myHttpClient.execute(myRequest);
0
Halvor Holsten Strand