Как ждать, пока HttpURLConnection завершится? - PullRequest
0 голосов
/ 11 октября 2018

Если я загружаю файл размером 100 КБ на определенный URL-адрес моего сервиса, wget требуется ~ 20 секунд для завершения:

wget --quiet --post-file data.txt --output-document - --header "Content-Type: text/csv" http://localhost:8080/ingest

Но если я делаю это так в Java, странным образом это происходит немедленно:

                HttpURLConnection con = (HttpURLConnection) url.openConnection();
                con.setRequestMethod("POST");
                con.setRequestProperty("Content-Type", "text/csv;charset=UTF-8");
                con.setDoOutput(true);
                OutputStream outputStream = con.getOutputStream();
                outputStream.write(str.getBytes("UTF-8"));
                outputStream.flush();
                outputStream.close();
                System.out.println("code=" + con.getResponseCode());
                BufferedReader in = new BufferedReader(
                        new InputStreamReader(con.getInputStream()));
                String inputLine;
                StringBuffer response = new StringBuffer();
                while ((inputLine = in.readLine()) != null) {
                    response.append(inputLine);
                }
                in.close();

поэтому я предполагаю, что на самом деле этот код не ожидает отправки данных, а делает это в фоновом режиме.Как заставить его заблокировать, пока фактическая передача данных не закончится?

1 Ответ

0 голосов
/ 11 октября 2018

Этот код должен ожидать завершения ответа.Вызов con.getResponseCode() не вернется (не может!), Пока сервер не ответит хотя бы заголовком ответа HTTP, содержащим код ответа.

Возможно, сервер отправляет заголовок ответа HTTP до того, какзакончил чтение данных, которые разместил клиент.Это было бы ошибкой.(Если сервер отправляет ответ слишком рано, он не может правильно установить код ответа!)

Возможно также, что ответ сервера не является ответом 2xx, и на сервере имеются сообщения об ошибках / диагностикапоток ошибок, а не входной поток.(Прочитайте javadocs на getInputStream против getErrorStream.)

Таким образом, наиболее вероятная причина, по которой не блокируется в течение ~ 20 секунд, заключается в том, что запрос не выполнен ... и об этом не сообщается должным образом,из-за проблем с реализацией на стороне сервера или на стороне клиента.


ОБНОВЛЕНИЕ - Оказывается, что реальная проблема заключалась в том, что на некоторых платформах "завиток" вел себя странно, вероятно из-за сетипроблемы с конфигурацией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...