我正在编写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;
}
但是请求是异步发出的,在请求完成之前,返回的响应是不完整的。谁能帮助我如何提出请求,等到回复完成。
我们非常感谢您的帮助!
答案 0 :(得分:1)
好像您要返回响应对象(而不是响应主体内容)。
尝试类似的东西:
return downloadedResponse.body().string()
我对HttpClient的经验是,头首先返回。除非/直到您食用它,否则内容不一定会杂乱无章。
答案 1 :(得分:0)
要发出同步GET请求,我们需要基于URL构建一个Request对象并进行调用。执行完后,我们返回一个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));
}
答案 2 :(得分:0)
您已经在使用同步方法调用。
client.newCall(downloadRequest).execute();
这是请求URL的同步方式。如果要进行异步调用,则需要使用Call类的enqueue方法。
call.enqueue(new Callback() {
public void onResponse(Call call, Response response)
throws IOException {
// ...
}
public void onFailure(Call call, IOException e) {
fail();
}
});
我认为问题出在别的地方。请提供更多详细信息,为什么您怀疑当前的异步调用,以便我们进行RCA。