J'ai un service Web exécuté sur ma boîte de développement implémenté à l'aide de Spring-MVC 3.0. J'ai plusieurs unités JUnit qui testent ce service à l'aide de RestTemplate. Ce que je voudrais faire, c'est que JMeter récupère ces requêtes JUnits REST requêtes lorsque je les exécute. Cependant, pour ce faire, j'ai besoin que Spring's RestTemplate les envoie au proxy que je suis exécutant JMeter. Alors, la question est, comment puis-je faire cela?
J'ai fait quelque chose de similaire avec CXF et leurs trucs http: conduit et http: client, mais je ne sais vraiment pas comment faire cela avec Spring-MVC.
La réponse de @ AHungerArtist fonctionne pour les cas d'utilisation simples, où vous souhaitez que toutes les demandes utilisent le même proxy. Si vous avez besoin de certaines requêtes via restTemplate pour utiliser le proxy, et d'autres non, vous pouvez trouver cela plus utile. (Ou si vous préférez le faire par programme plus que vous ne le souhaitez avec les propriétés du système!)
@Bean
public RestTemplate restTemplate() {
SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
Proxy proxy = new Proxy(Type.HTTP, new InetSocketAddress("my.Host.com", 8080));
requestFactory.setProxy(proxy);
return new RestTemplate(requestFactory);
}
Vous devriez pouvoir créer une copie du bean restTemplate de cette façon, et une autre de la manière normale, afin de pouvoir envoyer des requêtes avec et sans le proxy.
Malheureusement, c'était vraiment facile.
Properties props = System.getProperties();
props.put("http.proxyHost", "localhost");
props.put("http.proxyPort", "9080");
Spring a un bon documentation utilisant un Customizer pour déterminer un proxy différent
public class ProxyCustomizer implements RestTemplateCustomizer {
@Override
public void customize(RestTemplate restTemplate) {
final String proxyUrl = "proxy.example.com";
final int port = 3128;
HttpHost proxy = new HttpHost(proxyUrl, port);
HttpClient httpClient = HttpClientBuilder.create().setRoutePlanner(new DefaultProxyRoutePlanner(proxy) {
@Override
protected HttpHost determineProxy(HttpHost target, HttpRequest request, HttpContext context)
throws HttpException {
if (target.getHostName().equals("gturnquist-quoters.cfapps.io")) {
return super.determineProxy(target, request, context);
}
return null;
}
}).build();
restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory(httpClient));
}
}
et l'appel à appliquer le ProxyCustomizer est
@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
return builder.additionalCustomizers(new ProxyCustomizer()).build();
}
Vous pouvez également utiliser des paramètres d'exécution:
jre -DproxySet=true -Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=8888
mettez ces lignes avant d'appeler votre méthode get ou post. donc le proxy est prêt.
HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
DefaultHttpClient httpClient = (DefaultHttpClient) requestFactory.getHttpClient();
HttpHost proxy = new HttpHost("proxtserver", port);
httpClient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY,proxy);
restTemplate.setRequestFactory(requestFactory);