Как ждать завершения HTTP-запроса в Java - PullRequest
0 голосов
/ 03 октября 2018

Я пишу код Java, где я загружаю файл с сервера, и мне нужно скопировать файл в локальной системе, когда загрузка файла будет завершена.

Я использую следующий код: -

OkHttpClient.Builder builder = new OkHttpClient.Builder();
        OkHttpClient client = builder.readTimeout(600, TimeUnit.SECONDS).writeTimeout(600, TimeUnit.SECONDS)
                .connectTimeout(600, TimeUnit.SECONDS).build();
        Request downloadRequest = new Request.Builder().url(url + fileName).addHeader("cache-control", "no-cache")
                .addHeader("Authorization", token).build();
        try {
            Response downloadResponse = client.newCall(downloadRequest).execute();
            System.out.println(downloadResponse.message());
            System.out.println("got response from blob " + downloadResponse.isSuccessful() + " " + fileName);
            return downloadResponse;
        } catch (IOException e1) {
            e1.printStackTrace();
        }
    return null;

}

Но запрос выполняется асинхронно и до его завершения возвращается ответ, который является неполным.Может кто-нибудь, пожалуйста, помогите мне, как я могу сделать запрос и ждать, пока ответ не будет завершен.

Любая помощь высоко ценится!

Ответы [ 3 ]

0 голосов
/ 03 октября 2018

Похоже, что вы возвращаете объект ответа (не содержимое тела ответа).

попробуйте что-то вроде:

return downloadedResponse.body().string()

Мой опыт работы с HttpClient таков, что заголовки возвращаются первыми,Контент не обязательно попадет по сети, если только / пока вы его не используете.

0 голосов
/ 03 октября 2018

Вы уже используете синхронный вызов метода.

client.newCall(downloadRequest).execute();

Это синхронный способ запроса URL.Если вы хотите сделать асинхронный вызов, вам нужно использовать метод enqueue класса Call.

call.enqueue(new Callback() {
        public void onResponse(Call call, Response response) 
          throws IOException {
            // ...
        }

        public void onFailure(Call call, IOException e) {
            fail();
        }
    });

Я думаю, что проблема в другом.Просьба сообщить подробнее, почему вы подозреваете текущий как асинхронный вызов, чтобы мы могли выполнить RCA.

0 голосов
/ 03 октября 2018

Чтобы сделать синхронный GET-запрос, нам нужно построить объект Request на основе URL и выполнить Call.После его выполнения мы получаем экземпляр Response:

@Test
public void whenGetRequest_thenCorrect() throws IOException {
    Request request = new Request.Builder()
      .url(BASE_URL + "/date")
      .build();

    Call call = client.newCall(request);
    Response response = call.execute();

    assertThat(response.code(), equalTo(200));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...