web-dev-qa-db-ja.com

HttpComponentsClientHttpRequestFactoryおよびRestTemplateでのプロキシの使用

プロキシサーバーを使用するようにHttpComponentsClientHttpRequestFactoryを構成するにはどうすればよいですか。

私が見た例はすべてSimpleClientHttpRequestFactoryを使用しています。

13

Apache Http Clientを使用してもかまわない場合は、それほど複雑ではなく、2つの可能性があります。

  1. すべてのターゲットに対して単一のプロキシで十分な場合:

    HttpComponentsClientHttpRequestFactory clientHttpRequestFactory 
        = new HttpComponentsClientHttpRequestFactory(
            HttpClientBuilder.create()
                    .setProxy(new HttpHost("myproxy.com", 80, "http"))
                    .build());
    restTemplate = new RestTemplate(clientHttpRequestFactory);
    
  2. または、異なるターゲットURI、スキーマなどに異なるプロキシを使用する場合は、カスタムHttpRoutePlannerProxySelectorを使用できます。

    HttpRoutePlanner routePlanner = new SystemDefaultRoutePlanner(new MyProxySelector());
    
    HttpComponentsClientHttpRequestFactory clientHttpRequestFactory 
        = new HttpComponentsClientHttpRequestFactory(
            HttpClientBuilder.create()
                .setRoutePlanner(routePlanner)
                .build());
    restTemplate = new RestTemplate(clientHttpRequestFactory);
    

    プロキシセレクタの例:MyProxySelector.Java

    package hello;
    
    import Java.io.IOException;
    import Java.net.InetSocketAddress;
    import Java.net.Proxy;
    import Java.net.Proxy.Type;
    import Java.net.ProxySelector;
    import Java.net.SocketAddress;
    import Java.net.URI;
    import Java.util.ArrayList;
    import Java.util.List;
    
    public class MyProxySelector extends ProxySelector {
    
        ProxySelector defaultproxySelector = ProxySelector.getDefault();
    
        ArrayList<Proxy> noProxy = new ArrayList<Proxy>();
        ArrayList<Proxy> secureProxy = new ArrayList<Proxy>();
        ArrayList<Proxy> sociaMediaProxy = new ArrayList<Proxy>();
    
        public MyProxySelector(){
    
            noProxy.add(Proxy.NO_PROXY);
    
            secureProxy.add(new Proxy(Type.HTTP, new InetSocketAddress(
                "secure.proxy.mycompany.com", 8080)));
    
            sociaMediaProxy.add(new Proxy(Type.HTTP, new InetSocketAddress(
                    "social-media.proxy.mycompany.com", 8080)));
        }
    
        @Override
        public List<Proxy> select(URI uri) {
    
            // No proxy for local company addresses.
            if ( uri.getHost().toLowerCase().endsWith("mycompany.com") ) {
                return noProxy ;
            }
    
            // Special proxy for social networks.
            String Host = uri.getHost().toLowerCase();
            if (    Host.endsWith("facebook.com") ||
                    Host.endsWith("Twitter.com") ||
                    Host.endsWith("cfapps.io") ||               
                    Host.endsWith("flickr.com") ) 
            {
                return sociaMediaProxy ;
            }
    
            // for https URIs use secureProxy
            if ( uri.getScheme().toLowerCase().equals("https") ){
                return secureProxy ;
            }
    
            if (defaultproxySelector != null) {
                return defaultproxySelector.select(uri);
            }
    
            return noProxy;
        }
    
        @Override
        public void connectFailed(URI arg0, SocketAddress arg1, IOException arg2) {
            // TODO Auto-generated method stub
        }
    }
    
20
Michal Foksa

HttpComponentsClientHttpRequestFactoryに標準のJava SystemProperties for proxy-stuffを使用させる非常に簡単な方法( https://docs.Oracle.com/javase/8/docs/technotes/guidesを参照) /net/proxies.html

これは:

        HttpRoutePlanner routePlanner = new SystemDefaultRoutePlanner(ProxySelector.getDefault());

    HttpClient httpClient = HttpClientBuilder
            .create()
            .setRoutePlanner(routePlanner)
            .build();
    restTemplate.setRequestFactory(
            new HttpComponentsClientHttpRequestFactory(httpClient));

そうすれば、nonProxyHosts設定も考慮されます。

0