java DataOutputStream POST без проверки кода состояния не публикуется (POST не работает)

Я «исправил» это, но я не понимаю, почему мое исправление работает, и это меня беспокоит. Приведенный ниже код предназначен для HTTP POST на удаленный сервер. У меня две строки закомментированы. С двумя закомментированными строками кажется, что он пишет в открытое HTTP-соединение, но на удаленном сервере ничего не получено. Ошибок и исключений нет. С двумя раскомментированными строками, запрашивающими HTTP-код ответа, данные, похоже, действительно отправлены. Почему? Первоначально я написал это без двух строк, предполагая, что сброс и закрытие соединения будут вести себя так же, как сброс и закрытие соединения с файлом: то, что находится в буфере, записывается. Но, похоже, это не так. Есть ли лучший способ очистить и отправить данные POST, чем то, что я делаю?

    private void post()
            throws IOException {
        System.out.println("Posting xml to url " + postUrl);
        byte[] postData = htmlOutput.getBytes();
        URL post = new URL(postUrl);

        HttpURLConnection conn = (HttpURLConnection) post.openConnection();
        conn.setDoOutput(true);
        conn.setInstanceFollowRedirects(false);
        conn.setRequestMethod("POST");
        conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
        conn.setRequestProperty("charset", "utf-8");
        conn.setRequestProperty("Content-Length", Integer.toString(postData.length));
        conn.setUseCaches(false);
        DataOutputStream wr = new DataOutputStream(conn.getOutputStream());
        wr.write(postData);
        wr.flush();
        wr.close();

        conn.disconnect();
//        int responseCode = conn.getResponseCode();
//        System.out.println("POST Response Code from server was " + responseCode);

        System.out.println("Finished posting xml to url " + postUrl);
    }

person Warren    schedule 11.04.2020    source источник
comment
Любопытно: Зачем заключать в DataOutputStream, когда все, что вы делаете, это вызываете write(byte[])?   -  person Andreas    schedule 11.04.2020
comment
К сведению: charset не является значением заголовка HTTP, это атрибут Content-Type, т. е. он должен быть Content-Type", "application/x-www-form-urlencoded; charset=utf-8", и тогда вам нужно убедиться, что байты на самом деле являются UTF- 8, указав это при вызове htmlOutput.getBytes() как getBytes(StandardCharsets.UTF_8).   -  person Andreas    schedule 11.04.2020
comment
Я не думаю, что мне нужен UTF-8. Исходный код взят из примера, который я нашел в Интернете, и когда я работал над этим, я переключился на использование OutputStream, что кажется более подходящим. Знаете ли вы, почему необходимо получить ссылку на InputStream, прежде чем библиотека java сделает сообщение? Как я уже сказал в своем описании, я предполагал, что это будет работать как запись в файл.   -  person Warren    schedule 12.04.2020
comment
Вы читали ответ в разделе На этот вопрос уже есть ответ здесь: ссылка вверху? По сути, пока вы не запросите некоторую информацию из ответа, запрос все еще создается и буферизуется в памяти, поэтому до тех пор он не отправляется.   -  person Andreas    schedule 12.04.2020
comment
Да, я это читал. Я понимаю, что это часть того, что нужно сделать, чтобы код Java выполнял POST. Я не понимаю, ПОЧЕМУ это делается именно так, и я не понимаю, почему нет предупреждения или исключения, если вы не делаете это таким образом, но я принимаю это. Урок выучен. Я хочу поблагодарить вас за то, что вы остановились на этом вопросе, хотя вы его закрыли. Ваш комментарий помог.   -  person Warren    schedule 12.04.2020
comment
Если хотите, укажите мне, как я могу обрабатывать ответы с недопустимым Content-Type (или, возможно, без него). Возможно, мне придется обрабатывать ответ с Content-Type в соответствии с Java «неизвестно/неизвестно». Я знаю, что есть байты, которые нужно прочитать, но я не могу обойти исключение, которое выдает библиотека Java в этом случае. FireFox может отображать URL этого типа, поэтому я знаю, что это можно сделать.   -  person Warren    schedule 12.04.2020
comment
Это совсем другой вопрос. На заданный здесь вопрос (почему нужно звонить getResponseCode()) уже был дан ответ в другом вопросе, поэтому ваш вопрос закрыт как дубликат. Если у вас есть другой вопрос, например. об обработке ответа вам необходимо создать новый вопрос и предоставить всю необходимую информацию, например. пример ответа и то, что касается обработки этого ответа, который является проблемой для вас.   -  person Andreas    schedule 13.04.2020