如何在Java中等待HTTP请求完成

时间:2018-10-03 14:26:23

标签: java rest file http

我正在编写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 :(得分: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。