HttpClient调用
首先我是在公司需求是要集成一个tts(文本转语言),然后调用我们引擎组写的接口,我这边用的是httpclient的post方式,写完之后用postman调用,一点问题没有,很完美,然后打包给测试,在应用上调用发现,断断续续,一段话,有的返回成功,有的则不返回
我这边的场景是,循环调用,如果只是一次调用,可能就不会有这个问题了
先看下报错信息
org.apache.http.NoHttpResponseException: host:端口 failed to respond
原因
我也是在网上看到一篇博客说的原因是
httpclient 之前与服务端建立的链接已经失效(例如:tomcat 默认的keep-alive timeout :20s),再次从连接池拿该失效链接进行请求时,就会报错
postman一点问题没有可能是postman兼容性比较强?(这里我也不知道为什么)
解决方案:
ConnectionKeepAliveStrategy myStrategy = (response, context) -> {
Args.notNull(response, "HTTP response");
final HeaderElementIterator it = new BasicHeaderElementIterator(
response.headerIterator(HTTP.CONN_KEEP_ALIVE));
while (it.hasNext()) {
final HeaderElement he = it.nextElement();
final String param = he.getName();
final String value = he.getValue();
if (value != null && param.equalsIgnoreCase("timeout")) {
try {
return Long.parseLong(value) * 1000;
} catch (final NumberFormatException ignore) {
}
}
}
return 1;
};
CloseableHttpClient client = HttpClientBuilder.create()
.setConnectionManager(connectionManager)
.setKeepAliveStrategy(myStrategy)
.setDefaultRequestConfig(config)
.build();
setKeepAliveStrategy(myStrategy)
其实就是增加了一个策略KeepAliveStrategy
然后就完美解决了
以上是我在工作中的真实场景,如果大家有遇到同样的,或者有更好的解决办法,可以评论一下,感谢大家