[JAVA] [Spring Framework] Umgang mit HTTP-Anforderungsfehlern mithilfe von RestTemplate bei Verwendung eines Proxyservers

Überblick

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.

Was ist passiert

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.

Fehlermeldung


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

Bilddiagramm (Netzwerkumgebung)

proxy.png

Ursache

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.

So konfigurieren Sie die Proxyeinstellungen in der Spring Boot-Anwendung

1. Verwenden Sie System.setProperty

//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");

2. Geben Sie beim Starten der JVM ein Argument an

Geben Sie als Laufzeitargument für die Spring-Anwendung an

java ./application.jar -Dhttp.proxyHost=webcache.example.com -Dhttp.proxyPort=8080

3. Legen Sie beim Erstellen einer Instanz von RestTemplate die Factory-Einstellung fest

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

Referenzlink

Recommended Posts

[Spring Framework] Umgang mit HTTP-Anforderungsfehlern mithilfe von RestTemplate bei Verwendung eines Proxyservers
Fehlerbehandlung, wenn die Gradle-Abhängigkeit SLF4J verwendet
Beim Hochladen einer Datei mit Spring Boot wird eine Fehlerbehandlung durchgeführt, wenn die maximale Dateigröße überschritten wird.
[Java] So erhalten Sie eine Anfrage per HTTP-Kommunikation