Pytanie Spring RestTemplate i Proxy Auth


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

Oto mój kod:

    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 muszę uwierzytelnić się na serwerze proxy, ale jak to się robi? The Proxy typ, jak również SimpleClientHttpRequestFactory typ nie wydaje się obsługiwać poświadczeń. Bez referencji otrzymuję 407 ...


12
2017-07-07 15:39


pochodzenie




Odpowiedzi:


Po wielu różnych opcjach ustawiłem poniższy kod ze względu na możliwość ustawienia proxy dla RestTemplate podczas tworzenia, więc mogłem go przekształcić w osobną metodę. 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>

21
2018-05-20 10:42



Co jeśli używam Spring 3.0.1? Nie mam klasy HttpComponentsClientHttpRequestFactory - carlitos081
To rozwiązanie nie jest kompatybilne wstecznie z wersją 3, dlatego trzeba inaczej utworzyć zamówienie. 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. - Matthew Fontana
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


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

5
2017-11-03 20:23



Twój pracował dla mnie ... !! - harshavmb