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
然后就完美解决了

以上是我在工作中的真实场景,如果大家有遇到同样的,或者有更好的解决办法,可以评论一下,感谢大家

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐