#java
#java
Вопрос:
Какова функция или назначение HttpURLConnection.setDoInput
и HttpURLConnection.setDoOutput
?
Ответ №1:
Из документации для URLConnection
:
Установите флаг doInput равным true, если вы собираетесь использовать URL-соединение для ввода, false, если нет. Значение по умолчанию равно true.
Установите флаг DoOutput равным true, если вы собираетесь использовать URL-соединение для вывода, false, если нет. Значение по умолчанию равно false.
Что касается фактической цели, не похоже, что что-либо в коде Oracle проверяет doInput
переменную. Однако значение false по doOutput
умолчанию не позволит вам вызывать getOutputStream()
необходимые запросы HTTP POST. Таким образом, это способ заранее указать, что вы ожидаете записать в OutputStream
, фактически не устанавливая его.
Комментарии:
1. Да, я прочитал документацию. Просто не понимаю, «намереваюсь использовать URL-соединение для ввода, когда true, и false, если нет». Что на самом деле это значит?
2. Я просто добавил немного больше к ответу из того, что я знаю.
3. setDoInput(false) вызывается, когда тело ответа будет проигнорировано. Основной код Java вызывает это для сериализации JAXB и XML в URL-адресах. Смотрите: com/sun/org/apache/xml/internal/serialize/DOMSerializerImpl.java и javaxxmlbindJAXB.java
4. Обратите внимание, что если вы установите значение setDoInput(false), то вы даже не сможете проверить успех с помощью getResponseCode(), поскольку это неявно открывает inputstream .
5. Документация по setDoInput отстой. Я был удивлен, обнаружив, что «предназначенный для ввода» означает чтение из соединения, а не фактическое помещение в него данных (потому что это то, что означает «выполнение ввода»).
Ответ №2:
Я все еще был в замешательстве относительно того, что именно подразумевалось в документации под «Использовать URL-соединение для ввода».
Это может означать, что вы хотите прочитать информацию из ответа или что вы хотите ввести информацию в его запрос. В документации говорится:
Для ввода и / или вывода может использоваться URL-соединение. Установка флага doInput в значение true указывает, что приложение намерено считывать данные из URL-соединения.
Значение этого поля по умолчанию равно true.
Итак, если вы хотите игнорировать данные из ответа, вы можете установить для doInput значение false. Если вы хотите использовать getInputStream(), то вам следует оставить это в покое или установить для него значение true.
Для ввода и / или вывода может использоваться URL-соединение. Установка флага doOutput в значение true указывает, что приложение намерено записать данные в URL-соединение.
Значение этого поля по умолчанию равно false.
Итак, если вы хотите добавить данные к запросу (вызывая getOutputStream()), то вы должны установить для doOutput значение true.
Комментарии:
1. ввод означает, что вы хотите отправить запрос POST или PUT
Ответ №3:
Методы объявлены суперклассом, URLConnection
. Я думаю, целью было включить потенциальную оптимизацию в конкретных реализациях. Помните, что это URLConnection
не зависит от протокола (но HttpURLConnection
очевидно, что это не так).
Комментарии:
1.
protocol agnostic
? что вы имеете в виду?2. @YoushaAleayoub не привязан к какому-либо конкретному протоколу, такому как HTTP или FTP.