2017-02-22 1 views
0

현재 프로젝트에서 일하고 있습니다. 제 모듈은 HttpClient를 사용하여 외부 API 중 하나를 호출해야합니다.Java : HttpPost to API - ConnectTimeoutException - Apache HttpClient 4

POSTMAN을 사용하여 API에 수동으로 액세스 했으므로 성공적으로 연결하고 결과를 얻을 수 있지만 코드를 실행할 때 org.apache.http.conn.ConnectTimeoutException이 발생했습니다.

외부 API : 발생

http://10.9.11.222:8500/api/getDocs 

PostToApi class: 

    HttpPost httpPost = new HttpPost("http://10.9.11.222:8500/api/getDocs"); 
    StringEntity stringEntity = new StringEntity(jsonToBeSent);  
    httpPost.addHeader("Content-type", "application/json"); 
    httpPost.setEntity(stringEntity); 

    response = httpClient.execute(httpPost); 

    HttpEntity entity = response.getEntity(); 
    String responseString = EntityUtils.toString(entity, "UTF-8"); 

     serverResponse[0]=String.valueOf(response.getStatusLine().getStatusCode()); 
    serverResponse[1]=responseString; 

예외 :

org.apache.http.conn.ConnectTimeoutException: Connect to 10.9.11.222:8500 [/ 10.9.11.222] failed: connect timed out 
at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:143) 
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:353) 
at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:380) 
at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236) 
at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:184) 
at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:88) 
at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110) 
at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184) 
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:117) 
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:55) 
at element.bst.elementexploration.rest.util.PostToServer.post(PostToServer.java:58) 

답변

0

나는 내 문제의 해결책을 발견했습니다 : 나는 잊었다 우선 내가 프록시하지만를 사용하고 있다는 것입니다 내 HttpClient가 API를 가져 오는 동안 API를 사용하도록 구성하지 않았습니다.

내 해결 방법 :이 경우

HttpHost proxy = new HttpHost("xx.xx.xx.xx",proxyport,"http"); 
    DefaultProxyRoutePlanner routePlanner = new DefaultProxyRoutePlanner(proxy); 
    httpClient = HttpClients.custom().setRoutePlanner(routePlanner).build(); 

전체 PostToApi 클래스

HttpHost proxy = new HttpHost("xxx.xxx.xxx.xxx",port,"http"); 
    DefaultProxyRoutePlanner routePlanner = new DefaultProxyRoutePlanner(proxy); 
    httpClient = HttpClients.custom().setRoutePlanner(routePlanner).build(); 

    HttpPost httpPost = new HttpPost("http://10.9.11.222:8500/api/getDocs"); 
    StringEntity stringEntity = new StringEntity(jsonToBeSent);  
    httpPost.addHeader("Content-type", "application/json"); 
    httpPost.setEntity(stringEntity); 

    response = httpClient.execute(httpPost); 

    HttpEntity entity = response.getEntity(); 
    String responseString = EntityUtils.toString(entity, "UTF-8"); 

    serverResponse[0]=String.valueOf(response.getStatusLine().getStatusCode()); 
    serverResponse[1]=responseString; 
0

내가 HttpClient를 유창 API를 사용하는 것이 좋습니다 프록시와 PostToApi 클래스의 프록시를 추가 클라이언트는 어떤 복잡한 작업도해서는 안됩니다. 이것은 상용구 코드를 피하고 명확하고 간단한 코드를 작성하는 데 도움이됩니다. 모든 코드는 위의이 치환 될 수있다 :

HttpResponse response = Request.Post("http://10.9.11.222:8500/api/getDocs") 
      .bodyString(json, ContentType.APPLICATION_JSON)  
      .viaProxy(new HttpHost("xx.xx.xx.xx", proxyport)) 
      .execute().returnResponse(); 
ContentResponseHandler contentHandler = new ContentResponseHandler(); 
serverResponse[0] = response.getStatusLine().getStatusCode(); 
serverResponse[1] = contentHandler.handleEntity(response.getEntity()).asString(); 

당신은 유창 API here에 대한 자세한 내용을보실 수 있습니다.

+0

감사합니다. API를 확인합니다 :) – iamj