web-dev-qa-db-fra.com

Spring RestTemplate et Proxy Auth

J'essaie de faire REST appels avec Spring. Si je comprends bien, la bonne façon de faire est d'utiliser RestTemplate (?). Le problème est que je suis derrière un proxy .

Voici mon code en ce moment:

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

Semble fonctionner, mais je dois m'authentifier auprès du proxy, mais comment cela se fait-il? Le type Proxy ainsi que le type SimpleClientHttpRequestFactory ne semblent pas gérer les informations d'identification. Sans informations d'identification, je reçois seulement 407 ...

19
yogiginger

Après un certain nombre d'options différentes, j'ai opté pour le code ci-dessous en raison de la possibilité de définir le proxy du RestTemplate à la création afin de pouvoir le refactoriser dans une méthode distincte. Juste pour noter qu'il a également une dépendance supplémentaire, alors gardez cela à l'esprit.

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

// Dépendances que j'ai utilisées.

    <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>
22
Matthew Fontana

le code ci-dessous a fonctionné pour moi.

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);
6
Ewerton Costa