2010-09-10 17 views
22

J'ai un service Web en cours d'exécution sur ma boîte de dev implémenté en utilisant Spring-MVC 3.0. J'ai plusieurs JUnits qui testent contre ce service en utilisant RestTemplate. Ce que je voudrais faire, c'est que JMeter récupère ces requêtes JUnits REST quand je les lance. Cependant, pour ce faire, j'ai besoin que RestTemplate de Spring les envoie au proxy sur lequel je lance JMeter. Alors, la question est, comment puis-je faire cela?En utilisant RestTemplate, comment envoyer la requête à un proxy d'abord pour que je puisse utiliser mes junits avec JMeter?

J'ai fait quelque chose de similaire avec CXF et leurs trucs http: conduit et http: client, mais je n'ai vraiment aucune idée de comment faire cela avec Spring-MVC.

Répondre

40

La réponse acceptée fonctionne pour les cas d'utilisation simples, dans lesquels 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 pour ne pas le faire, vous trouverez peut-être cela plus utile. (Ou si vous aimez juste faire programmatiquement plus que vous aimez déblayage avec des 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 être en mesure de créer une copie de la fève de restTemplate de cette façon, et une autre de façon normale, de sorte que vous peut envoyer des demandes avec et sans le proxy.

+3

Juste comme une note pour quelqu'un d'autre regardant cela, la référence complète est java.net.Proxy pour la classe Proxy. – Paul

+0

Je préfère réellement de cette façon. Par exemple, si j'ai plusieurs services utilisant des hôtes différents, je peux configurer par hôte cible si je veux passer par-dessus le proxy. –

+0

Est-ce que ce proxy gère bien le POST avec les demandes de type de contenu en plusieurs parties? – NiVeR

0

Si vous comprenez correctement, vous voulez que le script Jmeter soit réinitialisé sur la base d'une requête JUnit RESET, est-ce correct?

Si tel est le cas, cela peut-il être aussi simple que d'envoyer une ligne de commande à un JMeter en lui disant d'arrêter/de démarrer?

11

Malheureusement, c'était vraiment facile.


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

Cela fonctionne très bien. Maintenant, comment ajoutez-vous le certificat Charles SSL? – yincrash

+0

Ah. C'est couvert sur la documentation de Charles. http://www.charlesproxy.com/documentation/using-charles/ssl-certificates/ – yincrash

+1

Rappelez-vous, cette méthode a un effet secondaire, puisque ces codes sont configurés votre jvm pour utiliser un proxy. Si vous avez une autre application qui s'exécute sous le même jvm, et que cette application n'a pas besoin d'utiliser un proxy, elle sera obligée d'utiliser le même proxy que celui que vous avez configuré auparavant. –

1

mettez ces lignes avant d'appeler votre méthode get ou post. Donc, le proxy est défini.

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

printemps a une bonne documentation using a Customizer to determine different proxy

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 d'appliquer la ProxyCustomizer est

@Bean 
public RestTemplate restTemplate(RestTemplateBuilder builder) { 
    return builder.additionalCustomizers(new ProxyCustomizer()).build(); 
}