2017-02-22 2 views
0

Actuellement, je travaille sur un projet, mon module nécessite d'appeler une de nos API externe en utilisant HttpClient.Java: HttpPost to API - ConnectTimeoutException - Apache HttpClient 4

J'ai manuellement accédé à l'API en utilisant POSTMAN et je peux me connecter avec succès et obtenir le résultat, mais quand je cours le code j'ai rencontré l'org.apache.http.conn.ConnectTimeoutException.

API externe:

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; 

Exception rencontrée:

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) 

Répondre

0

J'ai trouvé la solution de mon problème: La première chose que j'ai oublié que j'utilise un proxy mais je n'a pas configuré mon HttpClient pour l'utiliser pendant la récupération de l'API.

Ma solution: Ajouter le proxy en classe PostToApi

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

classe complète PostToApi avec le proxy

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

Je recommande d'utiliser l'API couramment la HttpClient, si vous le client ne devrait pas faire de choses compliquées. Cela permet d'éviter le code standard et d'écrire du code clair et simple. Tout le code ci-dessus peut être substitué par ceci:

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

Vous pouvez en savoir plus sur l'API couramment here.

+0

Merci, je vais vérifier cette API :) – iamj