Beim Versuch, eine Anforderung mit Spring's RestTemplate in einer Netzwerkumgebung, in der über einen Proxyserver auf das Internet zugegriffen wird, an eine externe API zu senden, ist ein Fehler aufgetreten.
In der Umgebung, die ich normalerweise entwickle, verwende ich keinen Proxyserver und die Untersuchung hat lange gedauert. Daher werde ich mir die Methode notieren, mit der ich mich dieses Mal befasst habe.
Der folgende Fehler trat auf, als ich eine GET-Anforderung über eine externe API mit "RestTemplate.exchange" in einer Netzwerkumgebung stellte, in der über einen Proxyserver auf das Internet zugegriffen wurde.
Wenn ich jedoch mit einem Browser (Chrome) auf dieselbe API zugegriffen habe, wurde die Antwort ordnungsgemäß zurückgegeben.
org.springframework.web.client.ResourceAccessException: I/O error on GET request for "{targetURL}":
Connection refused: connect;
nested exception is java.net.ConnectException: Connection refused: connect
Da der Browser die Proxy-Einstellungen des Host-Servers verwendete, war es möglich, beim Zugriff auf das Internet über den Proxyserver zuzugreifen, aber die Seite der Spring Boot-Anwendung konnte bei einer Anforderung nicht über den Proxyserver zugreifen.
Auf der Seite der Spring Boot-Anwendung scheint es, dass der Proxyserver nur verwendet werden kann, wenn die Proxyeinstellungen explizit in der Einstellungsdatei und den Laufzeitargumenten vorgenommen werden.
//In diesem Fall Webcache als Proxyserver.example.com:Verwenden Sie 8080
//Für https https.proxyHost, https.Verwenden Sie proxyPort
System.setProperty("http.proxyHost", "webcache.example.com");
System.setProperty("http.proxyPort", "8080");
Geben Sie als Laufzeitargument für die Spring-Anwendung an
java ./application.jar -Dhttp.proxyHost=webcache.example.com -Dhttp.proxyPort=8080
Die Methoden 1 und 2 wirken sich auf das gesamte System aus. Wenn Sie also den Einflussbereich einschränken möchten, verwenden Sie diese Methode.
//Stellen Sie hier den Proxy ein
Proxy proxy = new Proxy(Type.HTTP, new InetSocketAddress(PROXY_SERVER_HOST, PROXY_SERVER_PORT));
//Bereiten Sie ClientHttpRequestFactory für die Proxyeinstellungen für RestTermplate vor
SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
requestFactory.setProxy(proxy);
RestTemplate restTemplate = new RestTemplate(requestFactory);
//HTTP mit dieser Restvorlage(S)Kommunizieren
Recommended Posts