如何在不设置代理详细信息的情况下使用代理网络上的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());
}
}
}
如果使用启用了代理和防火墙的办公室网络,代码无法正常工作,但如果使用开放网络则相同的代码正常工作
答案 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);
在此之后,您可以使用您的代码。它肯定会奏效。如果您遇到任何问题,请告诉我。