Fiddler是非常好用的工具,能够非常方便的分析Http请求。最近SpringBoot项目需要使用RestTemplate调用远程的一个Rest API. 使用Postman测试调用那个API的时候一切正常,使用Java代码RestTemplate调用的时候就有问题。这时候就想到了使用Fiddler抓包,看一看这两次的http请求的具体内容有什么区别。这时候发现,Fiddler竟然不能抓到Java代码的Http请求。大致原因是JVM跳过了系统的代理设置(当启动Fiddler后,一般浏览器能够自动检测到本机网络Proxy的变化并且把所有流量都导向指定的代理。但是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代理处,然后再发送到目的地。