java - HttpClient URL 调用失败
问题描述
我正在尝试从 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":"为https://ABCD.com/完成 URL 设置","logger":"com.tesco.ReceiptClient.PublishClient.ReceiptPostClient:PostMessage"
"message":"CookieSpec selected: default","logger":"org.apache.http.client.protocol.RequestAddCookies:process"
"message":"上下文中未设置授权缓存","logger":"org.apache.http.client.protocol.RequestAuthCache:process"
"message":"连接请求:[路由:{s}-> https://ABCD.com:443 ][保持活动的总数:0;分配的路由:2 个中的 0 个;分配的总数:20 个中的 0 个]",记录器":"org.apache.http.impl.conn.PoolingHttpClientConnectionManager:requestConnection"
“消息”:“连接租用:[id:1][路由:{s}-> https://ABCD.com:443 ][保持活动的总数:0;分配的路由:2 个中的 1 个;分配的总数:1 个20]","记录器":"org.apache.http.impl.conn.PoolingHttpClientConnectionManager:leaseConnection"
"message":"打开连接 {s}-> https://ABCD.com:443 ","logger":"org.apache.http.impl.execchain.MainClientExec:execute"
"message":"正在连接到 ABCD.com/xxx.xx.xx.x:443","logger":"org.apache.http.impl.conn.DefaultHttpClientConnectionOperator:connect"
"message":"连接套接字到 ABCD.com/xxx.xx.xx.x:443 超时 3000","logger":"org.apache.http.conn.ssl.SSLConnectionSocketFactory:connectSocket"
“消息”:“http-outgoing-1:关闭连接”,“记录器”:“org.apache.http.impl.conn.LoggingManagedHttpClientConnection:shutdown”
“消息”:“连接丢弃”,“记录器”:“org.apache.http.impl.execchain.ConnectionHolder:abortConnection”
"message":"连接释放:[id: 2][路由:{s}-> https://ABCD.com:443 ][保持活动的总数:0;分配的路由:2 个中的 0 个;分配的总数:0 个20]","记录器":"org.apache.http.impl.conn.PoolingHttpClientConnectionManager:releaseConnection"
"message":"PostClient.IOException 出错。连接到 ABCD.com:443 [ABCD.com/xxx.xx.xx.x] 失败:连接超时","logger":"com.tesco.ReceiptClient.PublishClient .ReceiptPostClient:PostMessage"
解决方案
检查是否有与服务器的连接(telnet/ping)。
通常,当您与服务器没有任何连接时,您将收到连接超时错误,如果服务器花费的时间比“read-timeout”配置给出的时间更长,则会出现读取超时。
推荐阅读
- excel-formula - 如何在GETPIVOTDATA中引用包含monthnameshort的单元格范围
- ssh - VS Code:通过 SSH 从 Windows 自动上传(部署)文件
- elasticsearch - 如何根据分片数计算 Elasticsearch 的分片数?
- python - python中基于response.status_code的循环函数
- html - 用 css 和 html 将图表放在半页中
- laravel - 无法解决依赖性 [参数 #0
- javascript - 错误类型错误:fs_1.statSync 不是函数
- keras - Google Colab 中的空闲 GPU 内存
- php - 当用户关闭浏览器/选项卡时自动更改数据库中的状态
- go - 是否可以在运行时更新 zap 记录器的日志级别?