В моей программе есть метод с именем getResponse()
:
public ClosableHTTPResponse getResponse()
{
RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(120 * 1000).build();
CloseableHttpClient httpClient = null;
CloseableHttpResponse response = null;
try {
httpClient = HttpClientBuilder.create().setDefaultRequestConfig(requestConfig).build();
HttpGet httpPostRequest = new HttpGet(getURL);
httpPostRequest.addHeader("Authorization", "Token " + APIKey);
httpPostRequest.setHeader("Content-type", "application/json");
response = httpClient.execute(httpPostRequest);
String statusLine = response.getStatusLine().toString();
System.out.println("Status Line Response: " + statusLine);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (response != null) response.close();
if (httpClient != null) httpClient.close();
}
return response;
}
}
Когда я вызываю этот метод из внешнего метода в следующем коде:
public void analzyeReponseA()
{
CloseableHttpResponse response = null;
try {
response = getResponse("p1", "p2");
String OKResponse = "HTTP/1.1 200 OK";
String statusLine = response.getStatusLine().toString();
if (statusLine.contains(OKResponse)) {
HttpEntity entity = response.getEntity();
// java.net.SocketException: Socket is closed exception thrown on next line..
String responseString = EntityUtils.toString(entity, "UTF-8");
System.out.println("Response String:\n" + responseString);
}
}
Я получаю исключение java.net.SocketException: Socket is closed
на этой линии:
String responseString = EntityUtils.toString(entity, "UTF-8");
Основываясь на этом и этом потоке, предположительно это происходит, потому что я называю if (response != null) response.close();
в getResponse()
методе ( правильно? )
Если это так, мой вопрос теперь состоит в том, как вернуть CloseableHttpResponse
без программы, выдавшей исключение выше? Является ли единственной возможностью вызвать String responseString = EntityUtils.toString(entity, "UTF-8");
в методе getReponse()
и вернуть responseString
вместо CloseableHttpResponse
? Что, если я все еще хочу получить доступ к объекту response
в коде вызывающего абонента (например, проверить строку состояния или что-то еще)?