使用RestTemplate,如何首先将请求发送到代理,以便我可以将我的junits与JMeter一起使用?

AHu*_*ist 41 java rest proxy spring-mvc jmeter

我在使用Spring-MVC 3.0实现的开发盒上运行了一个Web服务.我有各种JUnit使用RestTemplate测试该服务.我想要做的是让JMeter在运行时获取这些JUnits REST请求.但是,要做到这一点,我需要让Spring的RestTemplate将它们发送到我正在运行JMeter的代理.所以,问题是,我该怎么做?

我已经用CXF和他们的http:conduit和http:client做了类似的东西,但我真的不知道怎么用Spring-MVC做这个.

Cor*_*han 74

@ AHungerArtist的答案适用于简单的用例,您希望所有请求都使用相同的代理.但是,如果您需要通过restTemplate使用代理请求某些请求,而其他请求则不需要,您可能会发现这更有用.(或者,如果您只是喜欢以编程方式执行此操作,而不是喜欢使用系统属性!)

@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);
}
Run Code Online (Sandbox Code Playgroud)

您应该能够以这种方式创建restTemplate bean的副本,并且能够以正常方式创建另一个副本,这样您就可以使用和不使用代理发送请求.

  • 就像其他任何人看到这个的注释一样,完整的引用是用于Proxy类的java.net.Proxy. (11认同)
  • Type类相同 - > java.net.Proxy.Type (2认同)

AHu*_*ist 17

可悲的是,这真的很容易.


Properties props = System.getProperties();
props.put("http.proxyHost", "localhost");
props.put("http.proxyPort", "9080");
Run Code Online (Sandbox Code Playgroud)

  • 请记住,这些方法有副作用,因为这些代码是设置你的jvm使用代理.如果您有另一个在同一个jvm下运行的应用程序,并且该应用程序不需要使用代理,它将被强制使用您之前设置的相同代理. (4认同)
  • 只是想指出,如果您发送 HTTP**S** 请求,则需要设置属性 `https.proxyHost` 和 `https.proxyPort`。如果您使用 SOCKS 代理,则有属性 `socksProxyHost` 和 `socksProxyPort` (由于“历史原因”,没有点)。[来源](https://docs.oracle.com/javase/8/docs/technotes/guides/net/proxies.html) (2认同)

Nic*_*las 8

Spring拥有使用Customizer确定不同代理的良好文档

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

    }

}
Run Code Online (Sandbox Code Playgroud)

调用ProxyCustomizer的调用是

@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
    return builder.additionalCustomizers(new ProxyCustomizer()).build();
}
Run Code Online (Sandbox Code Playgroud)