2015-07-07 2 views
7

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

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

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 ...

ответ

15

После довольно много различных вариантов, я остановился на ниже кода в связи с возможностью установки прокси для 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> 
+0

Что делать, если я использую Spring 3.0.1? У меня нет класса HttpComponentsClientHttpRequestFactory – carlitos081

+0

Это решение не обратно совместимо с Spring 3, вам нужно будет создать фабрику запросов по-разному. Я не знаком с весной 3, поэтому вам придется провести некоторое исследование. Я настоятельно рекомендую использовать Spring 4, поскольку Spring 5 уже в пути. –

+0

Я знаю, но, к сожалению, в моем проекте невозможно обновить более новую версию. Я обернулся, используя не прошедший проверку прокси-сервер и используя SimpleClientHttpRequestFactory (Spring 3.0.5) вместо HttpComponentsClientHttpRequestFactory (начиная с Spring 3.1) – carlitos081

5

код ниже работал для меня.

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); 
+0

Ваш трудный для меня ... !! – harshavmb

Смежные вопросы