HttpClient 在执行第二个请求时挂起

Posted

技术标签:

【中文标题】HttpClient 在执行第二个请求时挂起【英文标题】:HttpClient hangs when doing a second request 【发布时间】:2015-10-26 16:46:39 【问题描述】:

我正在编写一个可以在网站上登录和货比三家的 Java 应用程序。当我尝试执行第二个 HttpResponse/Post 时,我遇到了 HttpClient 挂起的问题。之前还好好的,不知道怎么就挂了。我没有收到任何错误,它只是坐在那里卡住了。我所做的唯一可能导致此挂起的更改是我正在使用 HttpGet 检索令牌,以便我可以登录网站。

这是我设置 httpClient 的方式

private static BasicCookieStore cookieStore = new BasicCookieStore();
private static HttpClient httpClient = HttpClientBuilder.create().setDefaultCookieStore(cookieStore).build();

剩下的只是一个标准的httpget & httppost,然后是httpclient.execute();

第一个序列是我的程序查询网站并检索令牌,然后我发送带有令牌的 POST 以登录。之后我的程序再次查询网站以获取产品信息,然后添加到购物车。但它在第二个 POST 时挂起。

我会不会在某处错过了同花顺?我在某处读到这种方式的 HttpClient 会自行关闭。并且 DefaultHttpClient 已被弃用。

【问题讨论】:

请展示一个简短但完整的程序来说明问题。 “挂起”是什么意思?有例外吗?消息是什么? 我怀疑问题出在您对课程的“标准”用法中...您可能没有清理您应该做的事情...您应该提供 short 演示问题的示例。 ETA:你甚至会问你是否在某处错过了冲洗——没有代码我们到底怎么知道? 我按照这个教程,mkyong.com/java/apache-httpclient-examples 【参考方案1】:

在下面发布的教程中,他们没有提到我应该使用 post.releaseConnection();它导致我的代码挂断,所以我在每次 POST/GET 之后添加了 releaseConnection() 函数。我希望这是清理代码的正确方法。

【讨论】:

谢谢各位,节省了一天【参考方案2】:

选项 1:重置请求

releaseConnection()reset() 将“重置请求的内部状态,使其可重用”:

HttpGet request = new HttpGet("https://httpbin.org/get");
try (CloseableHttpClient client = HttpClients.createDefault())    
    CloseableHttpResponse response = client.execute(request)  
    // do something with response
 finally 
    request.releaseConnection()

选项 2:关闭响应

在我们处理完响应后致电response.close()

HttpGet request = new HttpGet("https://httpbin.org/get");
try (CloseableHttpClient client = HttpClients.createDefault()) 
    try    
    CloseableHttpResponse response = client.execute(request)  
    // do something with response
     finally 
        response.close()
    

我们可以通过将响应添加到 try-with-resources 语句来整理:

HttpGet request = new HttpGet("https://httpbin.org/get");
try (CloseableHttpClient client = HttpClients.createDefault();
     CloseableHttpResponse response = client.execute(request)) 
    // do something with response

【讨论】:

以上是关于HttpClient 在执行第二个请求时挂起的主要内容,如果未能解决你的问题,请参考以下文章

Dapper 在执行时挂起

SSIS 数据流任务在执行预执行阶段时挂起

浏览器在收到 WWW-Authenticate: Negotiate 时挂起

SendMessage() WINAPI 在用于连接到 DDE 服务器时挂起

django manage.py runserver 在第二个请求后挂起(间歇性)

第二次调用 C# HttpClient 错误请求