Как сделать Java HTTP асин c запрос? - PullRequest
1 голос
/ 26 февраля 2020

При выполнении приведенного ниже кода я ожидал, что на консоли будет напечатано "passed", а затем, через 3 секунды, ответ сервера почтальона задержится ({"delay":"3"}), но вместо этого мне придется ждать 3 секунды, чтобы см. "passed" напечатано, после ответа сервера. Что я делаю не так?

    HttpClient client = HttpClient.newHttpClient();
       HttpRequest request = HttpRequest.newBuilder()
             .uri(URI.create("https://postman-echo.com/delay/3"))
             .header("cache-control", "no-cache")
             .header("postman-token", "6bac0475-7cd1-f51a-945f-2eb772483c2c")
             .build();
       client.sendAsync(request, BodyHandlers.ofString())
             .thenApply(HttpResponse::body)
             .thenAccept(System.out::println)
             .join(); 

       System.out.println("passed");

1 Ответ

2 голосов
/ 26 февраля 2020

Спасибо подсказкам @ Thilo, я получил то поведение, которое искал. То, что я имел в виду раньше, было чем-то вроде javascript, где вы цепляете свои свободные разговоры и продвигаетесь вперед. В Java вы инициируете вызовы, а затем, когда вы готовы заблокировать, вы звоните get() или join(). Итак, стало так:

    HttpClient client = HttpClient.newHttpClient();
       HttpRequest request = HttpRequest.newBuilder()
             .uri(URI.create("https://postman-echo.com/delay/3"))
             .header("cache-control", "no-cache")
             .header("postman-token", "6bac0475-7cd1-f51a-945f-2eb772483c2c")
             .build();

       CompletableFuture cf = client.sendAsync(request, BodyHandlers.ofString())
             .thenApply(HttpResponse::body)
             .thenAccept(System.out::println); 

       System.out.println("passed");

       HttpResponse<String> result = (HttpResponse<String>)cf.join();
...