[JAVA] [Spring Framework] Traitement des erreurs de requête HTTP à l'aide de RestTemplate lors de l'utilisation d'un serveur proxy

Aperçu

Une erreur s'est produite lorsque j'ai essayé d'envoyer une demande à une API externe à l'aide du RestTemplate de Spring dans un environnement réseau où Internet est accessible à l'aide d'un serveur proxy.

Dans l'environnement que je développe habituellement, je n'utilise pas de serveur proxy et il a fallu beaucoup de temps pour enquêter, je vais donc noter la méthode que j'ai traitée cette fois.

Qu'est-il arrivé

L'erreur suivante s'est produite lorsque j'ai fait une requête GET à l'aide d'une API externe à l'aide de RestTemplate.exchange dans un environnement réseau où l'accès à Internet à l'aide d'un serveur proxy.

Cependant, lorsque j'ai accédé à la même API avec un navigateur (Chrome), la réponse a été renvoyée correctement.

Message d'erreur


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

Diagramme d'image (environnement réseau)

proxy.png

Cause

Étant donné que le navigateur utilisait les paramètres proxy du serveur hôte, il était possible d'accéder via le serveur proxy lors de l'accès à Internet, mais le côté application Spring Boot n'était pas en mesure d'accéder via le serveur proxy lors de la demande.

Du côté de l'application Spring Boot, il semble que le serveur proxy ne puisse pas être utilisé à moins que les paramètres de proxy ne soient explicitement définis dans le fichier de paramètres et les arguments d'exécution.

Comment configurer les paramètres de proxy dans l'application Spring Boot

1. Utilisez System.setProperty

//Dans ce cas, Webcache en tant que serveur proxy.example.com:Utiliser 8080
//Pour https, https.proxyHost, https.Utiliser proxyPort

System.setProperty("http.proxyHost", "webcache.example.com");
System.setProperty("http.proxyPort", "8080");

2. Spécifiez comme argument lors du démarrage de la JVM

Spécifiez comme argument d'exécution pour l'application Spring

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

3. Définir à l'aide de l'usine lors de la création d'une instance de RestTemplate

Les méthodes 1 et 2 affectent l'ensemble du système, donc si vous souhaitez limiter la plage d'influence, utilisez cette méthode.

//Définissez le proxy ici
Proxy proxy = new Proxy(Type.HTTP, new InetSocketAddress(PROXY_SERVER_HOST, PROXY_SERVER_PORT));

//Préparer ClientHttpRequestFactory pour les paramètres de proxy pour RestTermplate
SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
requestFactory.setProxy(proxy);

RestTemplate restTemplate = new RestTemplate(requestFactory);
//HTTP utilisant ce modèle de repos(S)Communiquer

Lien de référence

Recommended Posts

[Spring Framework] Traitement des erreurs de requête HTTP à l'aide de RestTemplate lors de l'utilisation d'un serveur proxy
Gestion des erreurs lorsque la dépendance Gradle utilise SLF4J
Lors du téléchargement d'un fichier avec Spring Boot, la gestion des erreurs est effectuée lorsque la taille maximale du fichier est dépassée.
[Java] Comment obtenir une requête par communication HTTP