Je devais aussi faire la même chose, et après certains non optimaux avec les contrôleurs Spring et RestTemplate, j'ai trouvé une meilleure solution: Smiley's HTTP Proxy Servlet. L'avantage est, il fait vraiment AS-IS proxy, tout comme mod_proxy
d'Apache, et il le fait d'une manière en streaming, sans mettre en cache la demande/réponse complète dans la mémoire.
Simplement, vous enregistrez une nouvelle servlet dans le chemin que vous souhaitez attribuer à un autre serveur, et donnez à cette servlet l'hôte cible en tant que paramètre init. Si vous utilisez une application web traditionnelle avec un web.xml, vous pouvez le configurer comme suit:
<servlet>
<servlet-name>proxy</servlet-name>
<servlet-class>org.mitre.dsmiley.httpproxy.ProxyServlet</servlet-class>
<init-param>
<param-name>targetUri</param-name>
<param-value>http://target.uri/target.path</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>proxy</servlet-name>
<url-pattern>/mapping-path/*</url-pattern>
</servlet-mapping>
ou, bien sûr, vous pouvez aller avec le annotation config.
Si vous utilisez Spring Boot, il est encore plus facile: Il vous suffit de créer un bean de type ServletRegistrationBean
, avec la configuration requise:
@Bean
public ServletRegistrationBean proxyServletRegistrationBean() {
ServletRegistrationBean bean = new ServletRegistrationBean(
new ProxyServlet(), "/mapping-path/*");
bean.addInitParameter("targetUri", "http://target.uri/target.path");
return bean;
}
De cette façon, vous pouvez également utiliser les propriétés de printemps qui sont disponibles dans l'environnement.
Vous pouvez même étendre la classe ProxyServlet
et remplacer ses méthodes pour personnaliser les en-têtes de requête/réponse, etc., au cas où vous en auriez besoin.
Mise à jour: Après avoir utilisé le servlet proxy de Smiley pendant un certain temps, nous avons eu quelques problèmes de timeout, cela ne fonctionnait pas de manière fiable. Commuté à Zuul de Netflix, n'a pas eu de problèmes après cela. Un tutoriel sur la configuration avec Spring Boot peut être trouvé sur this link.
J'ai un client, un serveur intermédiaire et deux serveurs principaux. Le client ne parle qu'au serveur intermédiaire qui envoie son appel à un serveur. Le serveur renvoie une réponse au serveur intermédiaire, qu'il traite ensuite, puis renvoie la réponse au client. – user1144031
ne devrait pas copier les en-têtes de requête (3) et le corps (4) aussi pour copier les paramètres de demande (2) (puisque les paramètres post font partie du corps de la requête, pour qu'ils fassent partie de l'URL)? Serait-il redtuant (dans la requête http) si j'effectue les deux étapes – mickeymoon