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.
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.
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
É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.
//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");
Spécifiez comme argument d'exécution pour l'application Spring
java ./application.jar -Dhttp.proxyHost=webcache.example.com -Dhttp.proxyPort=8080
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
Recommended Posts