SpringBoot项目中对RestTemplate进行网络代理Proxy设置使得Fiddler能够进行抓包

Fiddler是非常好用的工具,能够非常方便的分析Http请求。最近SpringBoot项目需要使用RestTemplate调用远程的一个Rest API. 使用Postman测试调用那个API的时候一切正常,使用Java代码RestTemplate调用的时候就有问题。这时候就想到了使用Fiddler抓包,看一看这两次的http请求的具体内容有什么区别。这时候发现,Fiddler竟然不能抓到Java代码的Http请求。大致原因是JVM跳过了系统的代理设置,这就需要我们自己写代码来个RestTemplate
设置代理。

解决这个问题的方法很多,大部分是在RestTemplate实例生成的时候,设置它的HttpClientFactory中的代理。这种方法是比较典型的Spring注入实例的定制。

    @Bean
    public SimpleClientHttpRequestFactory httpClientFactory() {
        SimpleClientHttpRequestFactory httpRequestFactory = new SimpleClientHttpRequestFactory();
        httpRequestFactory.setReadTimeout(readTimeout);
        httpRequestFactory.setConnectTimeout(connectionTimeout);

        if(proxyConfig.getEnabled()){
            SocketAddress address = new InetSocketAddress(proxyConfig.getHost(), proxyConfig.getPort());
            Proxy proxy = new Proxy(Proxy.Type.HTTP, address);
            httpRequestFactory.setProxy(proxy);
        }

        return httpRequestFactory;
    }

    @Bean
    public RestTemplate restTemplate(SimpleClientHttpRequestFactory httpClientFactory) {
        RestTemplate restTemplate = new RestTemplate(httpClientFactory);
        return restTemplate;
    }

但是在我们的项目中这个办法是不行的,因为我们项目中引用了第三方的类库,SpringBoot在启动的时候,是第三方的类库完成了向容器中注入RestTemplate的动作,我们能做的就是去拿到这个RestTemplate实例进行使用,而不能订制。这时候,我们也可以对RestTemplate实例进行设置Proxy.

SimpleClientHttpRequestFactory reqfac = new SimpleClientHttpRequestFactory();
reqfac.setProxy(new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 62990)));
this.restTemplate.setRequestFactory(reqfac);

这样设置后,Java中RestTempalte发出的http请求,会先到达Fiddler代理处,然后再发送到目的地。

你可能感兴趣的:(技术积累)