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

use*_*509 22 java apache httpclient hang

我正在编写一个可以在网站上登录和购物的Java应用程序.当我尝试执行第二个HttpResponse/Post时,我遇到了HttpClient挂起的问题.它之前工作正常,不知道为什么它开始挂起.我没有得到任何错误,它只是坐在那里而陷入困境.我做的唯一一个可能导致这种挂断的变化是我正在使用HttpGet来检索令牌,所以我可以登录到该网站.

这是我如何设置httpClient

private static BasicCookieStore cookieStore = new BasicCookieStore();
private static HttpClient httpClient = HttpClientBuilder.create().setDefaultCookieStore(cookieStore).build();
Run Code Online (Sandbox Code Playgroud)

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

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

我可以在某个地方错过同花顺吗?我正在读某个地方,这种HttpClient关闭了.DefaultHttpClient已被弃用.

use*_*509 38

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


rus*_*heb 5

选项 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()
}
Run Code Online (Sandbox Code Playgroud)

选项 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()
    }
}
Run Code Online (Sandbox Code Playgroud)

我们可以通过添加对 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
}
Run Code Online (Sandbox Code Playgroud)