Spring RestTemplate и Proxy Auth

Я пытаюсь сделать REST-вызовы с помощью Spring. Насколько я понимаю, правильный путь - использовать RestTemplate (?). Проблема в том, что я за прокси.

Это мой код прямо сейчас:

    SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
    InetSocketAddress address = new InetSocketAddress(host, 3128);
    Proxy proxy = new Proxy(Proxy.Type.HTTP, address);
    factory.setProxy(proxy);

    RestTemplate restTemplate = new RestTemplate();
    restTemplate.setRequestFactory(factory);

Кажется, нужно работать, но мне нужно пройти аутентификацию в прокси, но как это сделать? Тип Proxy, а также тип SimpleClientHttpRequestFactory, похоже, не обрабатывают учетные данные. Без учетных данных я получаю всего 407...

Ответ 1

После нескольких различных вариантов я остановился на приведенном ниже коде из-за возможности установить прокси для RestTemplate при создании, чтобы я мог реорганизовать его в отдельный метод. Просто отметить, что у него также есть дополнительная зависимость, поэтому имейте это в виду.

    private RestTemplate createRestTemplate() throws Exception {
        final String username = "myusername";
        final String password = "myPass";
        final String proxyUrl = "proxy.nyc.bigtower.com";
        final int port = 8080;

        CredentialsProvider credsProvider = new BasicCredentialsProvider();
        credsProvider.setCredentials( 
                new AuthScope(proxyUrl, port), 
                new UsernamePasswordCredentials(username, password));

        HttpHost myProxy = new HttpHost(proxyUrl, port);
        HttpClientBuilder clientBuilder = HttpClientBuilder.create();

        clientBuilder.setProxy(myProxy).setDefaultCredentialsProvider(credsProvider).disableCookieManagement();

        HttpClient httpClient = clientBuilder.build();
        HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
        factory.setHttpClient(httpClient);

        return new RestTemplate(factory);
    }

//Зависимости, которые я использовал.

    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.5.2</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>4.2.5.RELEASE</version>
    </dependency>

Ответ 2

приведенный ниже код работал у меня.

RestTemplate restTemplate = new RestTemplate();

CredentialsProvider credsProvider = new BasicCredentialsProvider();
credsProvider.setCredentials( new AuthScope("proxyHost", "proxyPort"), new UsernamePasswordCredentials("proxyUser", "proxyPass") );
HttpClientBuilder clientBuilder = HttpClientBuilder.create();

clientBuilder.useSystemProperties();
clientBuilder.setProxy(new HttpHost("proxyHost", "proxyPort"));
clientBuilder.setDefaultCredentialsProvider(credsProvider);
clientBuilder.setProxyAuthenticationStrategy(new ProxyAuthenticationStrategy());

CloseableHttpClient client = clientBuilder.build();

HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
factory.setHttpClient(client);

restTemplate.setRequestFactory(factory);

Ответ 3

Я использовал тот же код, но получение 407.proxy учетных данных работает нормально с помощью команды curl, но с помощью приведенного выше кода не работает. любая идея?