2010-09-10 25 views
22

Tôi có một dịch vụ web chạy trên hộp dev của tôi được triển khai bằng Spring-MVC 3.0. Tôi có nhiều JUnits khác nhau kiểm tra dịch vụ đó bằng RestTemplate. Những gì tôi muốn làm là có JMeter nhận các yêu cầu JUnits REST khi tôi chạy chúng. Tuy nhiên, để làm điều đó, tôi cần phải có RestTemplate của Spring gửi chúng đến proxy mà tôi đang chạy JMeter. Vì vậy, câu hỏi là, làm thế nào tôi có thể làm điều đó?Sử dụng RestTemplate, làm thế nào để gửi yêu cầu đến một proxy đầu tiên để tôi có thể sử dụng junits của tôi với JMeter?

Tôi đã làm điều gì đó tương tự với CXF và http: conduit và http: công cụ khách hàng của họ, nhưng tôi thực sự không có ý tưởng làm thế nào để làm điều này với Spring-MVC.

Trả lời

40

Câu trả lời được chấp nhận hoạt động cho các trường hợp sử dụng đơn giản, nơi bạn muốn tất cả yêu cầu sử dụng cùng một proxy. Nếu bạn cần một số yêu cầu thông qua restTemplate để sử dụng proxy, và những người khác không, mặc dù, bạn có thể thấy điều này hữu ích hơn. (Hoặc nếu bạn chỉ thích làm nó lập trình nhiều hơn bạn như mucking với thuộc tính hệ thống!)

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

Bạn sẽ có thể tạo ra một bản sao của đậu restTemplate theo cách đó, và một số khác theo cách thông thường, vì vậy bạn có thể gửi các yêu cầu có và không có proxy.

+3

Cũng giống như một lưu ý cho bất cứ ai khác nhìn vào điều này, tham chiếu đầy đủ là java.net.Proxy cho lớp Proxy. – Paul

+0

Tôi thực sự thích cách này. Ví dụ: nếu tôi có nhiều dịch vụ bằng cách sử dụng các máy chủ khác nhau, tôi có thể định cấu hình cho mỗi máy chủ đích nếu tôi muốn truy cập proxy hoặc không. –

+0

Proxy này có xử lý tốt POST với yêu cầu loại nội dung nhiều phần không? – NiVeR

0

Nếu hiểu chính xác, bạn muốn tập lệnh Jmeter đặt lại dựa trên yêu cầu JUnit RESET, đúng không?

Nếu vậy, điều này có thể đơn giản như việc gửi một JMeter một dòng lệnh bảo nó dừng/bắt đầu không?

11

Đáng buồn thay, điều này thực sự dễ dàng.


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

này hoạt động tuyệt vời. Bây giờ bạn thêm chứng chỉ Charles SSL như thế nào? – yincrash

+0

Ah. Điều đó được đề cập trong tài liệu của Charles. http://www.charlesproxy.com/documentation/using-charles/ssl-certificates/ – yincrash

+1

Hãy nhớ rằng, phương pháp này có tác dụng phụ, vì các mã này đang thiết lập jvm của bạn để sử dụng proxy. Nếu bạn có một ứng dụng khác chạy dưới cùng một jvm và ứng dụng đó không cần phải sử dụng proxy, nó sẽ buộc phải sử dụng cùng một proxy mà bạn thiết lập trước đó. –

1

đặt những dòng này trước khi gọi phương thức nhận hoặc đăng của bạn. để proxy được đặ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

Spring có một tốt 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)); 

    } 

} 

và cuộc gọi áp dụng các ProxyCustomizer là

@Bean 
public RestTemplate restTemplate(RestTemplateBuilder builder) { 
    return builder.additionalCustomizers(new ProxyCustomizer()).build(); 
} 
Các vấn đề liên quan