2015-07-07 8 views
7

Próbuję wykonywać połączenia REST z wiosną. Jak rozumiem, właściwą drogą jest użycie RestTemplate (?). Problem polega na tym, że jestem za proxy.Spring RestTemplate i Proxy Auth

To jest mój kod teraz:

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

wydaje się działać, ale potrzebuję do uwierzytelnienia na serwerze proxy, ale jak to zrobić? Typ Proxy jak i SimpleClientHttpRequestFactory wydaje się nie obsługiwać poświadczeń. Bez poświadczeń, dostaję właśnie 407 ...

Odpowiedz

15

Po dość kilka różnych opcji, zdecydowałem się na poniższy kod ze względu na możliwość ustawienia proxy dla RestTemplate przy tworzeniu więc mogłem byłaby go w osobnej metody. Pamiętaj, że ma również dodatkową zależność, więc miej to na uwadze.

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); 
    } 

// Zależności, których użyłem.

<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

Co jeśli używam Spring 3.0.1? Nie mam klasy HttpComponentsClientHttpRequestFactory – carlitos081

+0

To rozwiązanie nie jest kompatybilne wstecz z wersją 3, dlatego trzeba inaczej utworzyć żądanie. Nie jestem zaznajomiony ze Spring 3, więc będziesz musiał przeprowadzić pewne badania. Gorąco polecam Spring 4, ponieważ Spring 5 jest już w drodze. –

+0

Wiem, ale niestety, w moim projekcie nie jest możliwe uaktualnienie nowszej wersji. Odwróciłem się używając nieuwierzytelnionego proxy i używając SimpleClientHttpRequestFactory (Spring 3.0.5) zamiast HttpComponentsClientHttpRequestFactory (od wiosny 3.1) – carlitos081

5

poniższy kod pracował dla mnie.

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

Pozdrawiam dla mnie ... !! – harshavmb