Spring RestTemplate和Proxy Auth

yog*_*ger 21 java proxy spring spring-mvc

我正在尝试使用Spring进行REST调用.据我所知,正确的方法是使用RestTemplate(?).问题是,我是一个代理人.

这是我现在的代码:

    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);
Run Code Online (Sandbox Code Playgroud)

似乎工作,但我需要在代理验证,但这是如何完成的?该Proxy类型以及该SimpleClientHttpRequestFactory类型似乎不处理凭据.没有凭据,我只得到407 ......

Mat*_*ana 26

经过几个不同的选项,我决定使用下面的代码,因为能够在创建时为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);
    }
Run Code Online (Sandbox Code Playgroud)

//我使用的依赖项

    <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>
Run Code Online (Sandbox Code Playgroud)


小智 6

下面的代码对我有用.

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);
Run Code Online (Sandbox Code Playgroud)