执行第二个请求时 HttpClient 挂起选项 1:重置请求选项 2:关闭响应

2022-09-01 07:40:26

我正在编写一个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以登录。之后,我的程序再次查询网站以获取产品信息,然后添加到购物车中。但它在第二个开机自检时挂起。

我是否会在某个地方错过潮红?我在某处读到,这种HttpClient的方式会自行关闭。DefaultHttpClient已被弃用。


答案 1

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


答案 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
}

推荐