我试图从一台linux机器上对一个API进行Http POST。但是我对URL的调用出现了超时错误。我使用的是httpclient-4.5.8库。最初我的客户端服务器没有被列入白名单,所以我曾经从URL中得到 "403-Forbidden"。但是在白名单之后,出现了超时错误。
public void PostMessage() {
try {
final RequestConfig params = RequestConfig.custom().setConnectTimeout(3000).setSocketTimeout(3000).build();
httpPost = new HttpPost(getUri());
log4.debug("URL set up done for "+ httpPost.getURI());
final StringEntity entity = new StringEntity(getMessage());
httpPost.setConfig(params);
httpPost.setEntity(entity);
httpPost.setHeader("Content-type", "application/json");
CloseableHttpResponse response = (CloseableHttpResponse) client.execute(httpPost);
log4.info("Response Code:" + response.getStatusLine().getStatusCode());
BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
String line = "";
while ((line = rd.readLine()) != null) {
log4.info("Response Content:" + line);
}
} catch (IOException i) {
log4.info("Error at PostClient.IOException. " + i.getMessage());
} catch(Exception e) {
log4.info("Error at PostClient.Exception. " + e.getMessage());
}
}
日志跟踪。(请原谅我的遮挡)
"message": "URL设置完成,为 https:/ABCD.com", "logger": "com.tesco.ReceiptClient.PublishClient.ReceiptPostClient:PostMessage"
"message": "CookieSpec selected: default", "logger": "org.apache.http.client.protocol.RequestAddCookies:process"
"message": "上下文中未设置Auth缓存", "logger": "org.apache.http.client.protocol.RequestAuthCache:process"
"消息": "连接请求:[路由。{s}->https:/ABCD.com:443][共 Keep alive: 0; route allocated: 0 of 2; total allocated: 0 of 20]", "logger": "org.apache.http.impl.conn.PoolingHttpClientConnectionManager:requestConnection"
"message": "连接已租用。[id:1][路由。{s}->https:/ABCD.com:443][共 Keep alive: 0; route allocated: 1 of 2; total allocated: 1 of 20]", "logger": "org.apache.http.impl.conn.PoolingHttpClientConnectionManager:leaseConnection"
"消息": "打开连接{s}->https:/ABCD.com:443。", "logger": "org.apache.http.impl.execchain.MainClientExec:execute"
"message": "连接到ABCD.comxxx.xx.xx.x:443", "logger": "org.apache.http.impl.conn.DefaultHttpClientConnectionOperator:connect"
"message": "Connecting socket to ABCD.comxxx.xx.xx.x:443 with timeout 3000", "logger": "org.apache.http.conn.ssl.SSLConnectionSocketFactory:connectSocket"
"message": "http-outgoing-1: Shutdown connection", "logger": "org.apache.http.impl.conn.LoggingManagedHttpClientConnection:shutdown"
"message": "Connection discarded", "logger": "org.apache.http.impl.execchain.ConnectionHolder:abortConnection"
"message": "连接已释放。[id: 2][route: {s}->https:/ABCD.com:443][共 Keep alive: 0; route allocated: 0 of 2; total allocated: 0 of 20]", "logger": "org.apache.http.impl.conn.PoolingHttpClientConnectionManager:releaseConnection"
"message": "Error at PostClient.IOException. 连接到ABCD.com:443 [ABCD.comxxx.xx.xx.x] 失败:连接已超时", "logger": "com.tesco.ReceiptClient.PublishClient.ReceiptPostClient:PostMessage"
检查是否与服务器有连接(telnetping)。
通常你会得到 连接超时 当你与服务器没有任何连接时,会出现错误。阅读时间结束 如果服务器需要的时间比 "read-timeout "配置的时间长。