Как дождаться завершения HTTP-запроса в java

Я пишу код 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;

}

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

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

Execute () уже является блокирующим вызовом. Следует дождаться завершения загрузки. Что выводит downloadResponse.isSuccessful () или код статуса ответа?

notionquest 03.10.2018 17:07
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
4 190
3

Ответы 3

Чтобы сделать синхронный запрос GET, нам нужно создать объект запроса на основе URL-адреса и выполнить вызов. После его выполнения мы возвращаем экземпляр 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));
}

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

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

return downloadedResponse.body().string()

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

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

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.

Другие вопросы по теме