web-dev-qa-db-fra.com

À l'aide de RestTemplate, comment envoyer d'abord la demande à un proxy afin que je puisse utiliser mes junits avec JMeter?

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.

37
AHungerArtist

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.

70
CorayThan

Malheureusement, c'était vraiment facile.


Properties props = System.getProperties();
props.put("http.proxyHost", "localhost");
props.put("http.proxyPort", "9080");
16
AHungerArtist

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();
}
7
Nicolas

Vous pouvez également utiliser des paramètres d'exécution:

jre -DproxySet=true -Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=8888
1
itstata

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);
1
abhishek ringsia