如何在代理服务器上使用rest模板时避免代理

时间:2016-04-05 13:11:48

标签: java spring resttemplate

如何在不设置代理详细信息的情况下使用代理网络上的rest模板从API获取响应?

示例:http://gturnquist-quoters.cfapps.io/api/random。 我打开浏览器时会收到回复,我试图通过代理网络使用API​​,但我不想在代码中使用proxyHost和proxyPort,收到错误:连接超时:连接;嵌套异常是java.net.ConnectException:连接超时:连接

公共类RestWithoutProxy {

/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub
    RestTemplate restTemplate = new RestTemplate(); 
    String url="http://gturnquist-quoters.cfapps.io/api/random";
    HttpHeaders headers = new HttpHeaders();
    headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
    HttpEntity<String> entity = new HttpEntity<String>("parameters", headers);
    System.out.println("... calling api");
    try{
        ResponseEntity<String> response = restTemplate
                .exchange(url, HttpMethod.GET, entity, String.class);
        System.out.println("response: "+ response.getBody());
    }catch(HttpStatusCodeException ex){
        int statusCode = ex.getStatusCode().value();
        System.out.println("error code: "+statusCode+"\n"+ex.getMessage());
    }catch (Exception ex) {
        System.out.println("......inside rest exception\n"+ ex.getMessage());
    }
}

}

如果使用启用了代理和防火墙的办公室网络,代码无法正常工作,但如果使用开放网络则相同的代码正常工作

1 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,经过两天的调试,终于找到了解决方案。认为最好分享这些信息,即使这个问题在几个月前被问到了。

<强>原因: 如果您获得连接超时异常,则更有可能出现代理问题。 的解决方案: 在这种情况下,我们必须使用RestTemplate创建SimpleClientHttpRequestFactory

您需要从托管应用程序的服务器获取Proxyhost和代理端口。 例如 - 在tomcat中,可以使用以下代码段获取这些详细信息 -

System.getProperty("http.yourproxyHost.com")
System.getProperty("http.proxyPort")

然后您可以使用以下代码段:

SimpleClientHttpRequestFactory clientHttpReq = new SimpleClientHttpRequestFactory();
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("ur.proxy.com", port));
clientHttpReq.setProxy(proxy);

现在可以通过以下方式创建RestTemplate -

RestTemplate restTemplate = new RestTemplate(clientHttpReq);

在此之后,您可以使用您的代码。它肯定会奏效。如果您遇到任何问题,请告诉我。