Я пишу код 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;
}
Но запрос выполняется асинхронно, и до завершения запроса возвращается неполный ответ. Может ли кто-нибудь помочь мне, как я могу сделать запрос и дождаться завершения ответа.
Любая помощь высоко ценится!




Чтобы сделать синхронный запрос 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.
Execute () уже является блокирующим вызовом. Следует дождаться завершения загрузки. Что выводит downloadResponse.isSuccessful () или код статуса ответа?