Управление моментом закрытия OkHttpClient3 с помощью java - PullRequest
0 голосов
/ 26 апреля 2020

когда я устанавливаю okhttpClient3, я отправляю запрос на получение, подобный следующему:

public String sendGetRequest(String url, HashMap<String, String> headersMap) throws Exception {

        Headers headers = addHeaders(headersMap);
        Request request = new Request.Builder()
                .url(url).headers(headers).build();
        try{
            Response response =httpClient.newCall(request).execute();
            LOG.info(String.format("Response data is: =[%s]", response.body().string()));
            return response.body().string();
        }catch(Exception e){
            LOG.error(String.format("Request failed=[%s]",e.getMessage()));

        }finally {
            httpClient.connectionPool().evictAll();
        }

        return null;
    }

Я вижу, что когда я пытаюсь вернуть строковый ответ, я получаю, что клиент был закрыт. Как я могу управлять, когда клиент будет закрыт?

1 Ответ

1 голос
/ 26 апреля 2020

При выполнении дважды response.body() вы пытаетесь использовать тело запроса дважды: один раз в журнале LOG.info(String.format("Response data is: =[%s]", response.body().string())); и один раз в операторе возврата return response.body().string();. Согласно документации, он может быть использован только один раз:

Возвращает ненулевое значение, если этот ответ был передан {@link Callback # onResponse} или возвращен из {@link Call # execute () }. Тела ответа должны быть {@linkplain ResponseBody closed} и могут использоваться только один раз. Вы можете избежать этого, сначала сохранив его в переменной, а затем используя эту переменную, например,

final String requestBody = response.body().string();
LOG.info(String.format("Response data is: =[%s]", requestBody));
return requestBody;

Также вы можете заменить try-catch на стиль try-with-resources, например

try (Response response = httpClient.newCall(request).execute()) {
...
}
...