2010-09-10 4 views
22

Ich habe einen Web-Service auf meiner Dev-Box mit Spring-MVC 3.0 implementiert. Ich habe verschiedene JUnits, die mit RestTemplate gegen diesen Dienst testen. Ich möchte, dass JMeter diese JUnits-REST-Anforderungen abruft, wenn ich sie ausführe. Dazu muss Spring's RestTemplate jedoch an den Proxy gesendet werden, auf dem JMeter läuft. Die Frage ist also, wie kann ich das tun?Wie verwende ich RestTemplate, um die Anfrage zuerst an einen Proxy zu senden, damit ich meine junits mit JMeter verwenden kann?

Ich habe etwas ähnliches mit CXF und ihren http: Conduit und http: Client Zeug, aber ich habe wirklich keine Ahnung, wie man dies mit Spring-MVC tun.

Antwort

40

Die angenommene Antwort funktioniert für einfache Anwendungsfälle, in denen alle Anforderungen den gleichen Proxy verwenden sollen. Wenn Sie einige Anforderungen über restTemplate benötigen, um den Proxy zu verwenden, und andere nicht, können Sie dies möglicherweise nützlicher finden. (Oder wenn Sie wie es zu tun programmatisch mehr, als Sie wie mit Systemeigenschaften Ausmisten!)

@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); 
} 

sollten Sie in der Lage sein, eine Kopie der restTemplate Bohne, so zu schaffen, und einem anderen die normale Art und Weise, so dass Sie kann Anfragen mit und ohne den Proxy senden.

+3

Nur als eine Anmerkung für alle anderen, die dies betrachten, ist die vollständige Referenz java.net.Proxy für die Proxy-Klasse. – Paul

+0

Ich bevorzuge eigentlich diesen Weg. Zum Beispiel, wenn ich mehrere Dienste mit verschiedenen Hosts habe, kann ich pro Ziel-Host konfigurieren, wenn ich über Proxy gehen will oder nicht. –

+0

Behandelt dieser Proxy POST mit Anforderungen für mehrteilige Inhaltstypen? – NiVeR

0

Wenn Sie es richtig verstehen, möchten Sie, dass das Jmeter-Skript basierend auf einer JUnit-RESET-Anforderung zurückgesetzt wird, richtig?

Wenn ja, könnte das so einfach sein wie das Senden eines JMeter eine Befehlszeile, die es zum Stoppen/Starten sagt?

11

Leider war dies wirklich einfach.


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

Dies funktioniert gut. Wie fügen Sie das Charles SSL-Zertifikat hinzu? – yincrash

+0

Ah. Das ist in der Dokumentation von Charles behandelt. http://www.charlesproxy.com/documentation/using-charles/ssl-certificates/ – yincrash

+1

Bitte denken Sie daran, diese Methode hat einen Nebeneffekt, da diese Codes Ihre jvm eingerichtet sind, um einen Proxy zu verwenden. Wenn Sie eine andere Anwendung haben, die unter demselben jvm ausgeführt wird und diese Anwendung keinen Proxy verwenden muss, wird sie gezwungen, denselben Proxy zu verwenden, den Sie zuvor eingerichtet haben. –

1

Setzen Sie diese Zeilen, bevor Sie Ihre Methode zum Abrufen oder Buchen aufrufen. So wird Proxy eingerichtet.

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

Frühling hat einen guten 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)); 

    } 

} 

und den Ruf den ProxyCustomizer anzuwenden ist

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