Как вернуть CloseableHttpResponse? - PullRequest
1 голос
/ 22 марта 2019

В моей программе есть метод с именем 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 в коде вызывающего абонента (например, проверить строку состояния или что-то еще)?

1 Ответ

0 голосов
/ 22 марта 2019

Если бы я правильно понял вопрос, я сначала посмотрел бы, действительно ли код должен возвращать HttpResponse. Если метод (ы), которые вызывают getResponse(), все нуждаются только, например, в содержимом, то возвращают содержимое, а не ответ.

В противном случае вы сможете это сделать, используя метод проб с ресурсами:

public void callingMethod() {
  try (CloseableHttpResponse resp = getResponse();) {
  {
      // example
      HttpEntity entity = resp.getEntity();
  }
}

И удалить закрытие из метода getResponse().

Кроме того, вы не хотите открывать / закрывать HttpClient при каждом вызове. Этот класс предназначен для многократного использования. Больше информации на . Вы используете HttpClient неправильно, и это дестабилизирует ваше программное обеспечение . Таким образом, вы можете изменить код для перемещения HttpClient в другое место.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...