2015-07-07 22 views
7

Sto provando a effettuare chiamate REST con Spring. Come ho capito, il modo giusto per andare è usare RestTemplate (?). Il problema è che sono dietro un proxy.Spring RestTemplate e Proxy Auth

Questo è il mio codice in questo momento:

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

sembra funzionare, ma ho bisogno di autenticazione al proxy, ma come è questo fatto? Il tipo Proxy e il tipo SimpleClientHttpRequestFactory non sembrano gestire le credenziali. Senza credenziali, sto diventando solo 407 ...

risposta

15

Dopo parecchie opzioni differenti ho optato per il codice qui sotto a causa della possibilità di impostare il proxy per il RestTemplate al momento della creazione così ho potuto refactoring in un metodo separato. Basta notare che ha anche una dipendenza aggiuntiva, quindi tienilo a mente.

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

// Dipendenze utilizzate.

<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

Cosa succede se sto usando Spring 3.0.1? Non ho la classe HttpComponentsClientHttpRequestFactory – carlitos081

+0

Questa soluzione non è retrocompatibile per Spring 3, dovrai creare la factory di richiesta in modo diverso. Non ho familiarità con Spring 3, quindi dovrai fare qualche ricerca. Raccomando caldamente di utilizzare Spring 4 poiché la Spring 5 è già in arrivo. –

+0

Lo so, ma sfortunatamente, sul mio progetto, non è possibile aggiornare una versione più recente. Mi sono voltato usando un proxy non autenticato e usando SimpleClientHttpRequestFactory (Spring 3.0.5) invece di HttpComponentsClientHttpRequestFactory (Dalla primavera 3.1) – carlitos081

5

il codice qui sotto ha funzionato per me.

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

La tua ha funzionato per me ... !! – harshavmb

Problemi correlati