2017-02-22 7 views
0

現在、私はプロジェクトに取り組んでいます。私のモジュールはHttpClientを使って外部APIの1つを呼び出す必要があります。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

私は私の問題の解決策を見つけた:私は忘れてしまった まず最初は、私はプロキシを使用しているということですが、私APIのフェッチ中にHttpClientを使用するように設定していませんでした。

私の解決策:プロキシ

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

と がPostToApiクラスで

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

をプロキシを追加完全PostToApiクラス私はあなたならば、HttpClientをの流暢APIを使用することをお勧めしますクライアントは複雑な作業をすべきではありません。これにより、定型コードの作成を避け、明確かつ単純なコードを書くことができます。上記のすべてのコードは、この置換されていてもよい:

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

関連する問題