SpringBoot 設置HTTP代理訪問
遇到這樣的一個場景,代碼部署到私有服務器上去之后,這臺私有服務器a無法直接訪問公網,需要通過代理轉發到另外一臺專門訪問公網的服務器b, 讓服務器b去請求對應的公網ip,于是就需要設置Http代理。
通常使用springboot會用到兩種不同的httpclient
-
spring-boot-starter-webflux 這個包下面的WebClient
-
Spring-web 這個包下面的RestTemplate
WebClient
通過設置Httpclinet添加綁定的代理地址,然后給WebClient里添加這個Httpclient
HttpClient httpClient ?= HttpClient.create().proxy(proxy -> proxy.type(ProxyProvider.Proxy.HTTP).address(new InetSocketAddress("192.168.0.1", 8080)) ?// 你的代理IP和端口);
?
WebClient webClient = webClientBuilder.baseUrl("https://www.baidu.com").clientConnector(new ReactorClientHttpConnector(httpClient)).build();
?
?
String result = webClient.get().retrieve().bodyToMono(String.class).block();
RestTemplate
// 服務器代理
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("192.168.0.1", 8080));
// 配置 request factory
SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
requestFactory.setProxy(proxy);
?
RestTemplate restTemplate = new RestTemplate();
ProxySetting proxySetting = SpringContextHolder.getBean(ProxySetting.class);
// This allows us to read the response more than once - Necessary for debugging.
// 如果開啟代理,則配置走服務器代理。否則走本地調試
if (proxySetting.isEnable()) {restTemplate.setRequestFactory(requestFactory);
} else {restTemplate.setRequestFactory(new SimpleClientHttpRequestFactory());
}
?
DefaultUriBuilderFactory uriBuilderFactory = new DefaultUriBuilderFactory(); ? ? uriBuilderFactory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.VALUES_ONLY);
restTemplate.setUriTemplateHandler(uriBuilderFactory);
?
String url = "https://www.baidu.com"
String response = restTemplate.getForObject(url, String.class);