2011-12-21 3 views
60

setDoOutput() в URLConnection. В соответствии с documentation я долженЧто именно влияет URLConnection.setDoOutput()?

Установите флаг DoOutput в значение true, если вы собираетесь использовать URL-соединение для вывода, а false, если нет.

Теперь я столкнулся exactly this problem - среда выполнения Java преобразует запрос в POST раз setDoOutput(true) называется, а сервер отвечает только GET запросов. Я хочу понять, что произойдет, если я удалю этот код setDoOutput(true) из кода.

Что именно это повлияет? Предположим, я установил его в false - что я могу сделать сейчас и что я не могу сделать сейчас? Смогу ли я выполнить GET запросов? Что такое «выход» в контексте этого метода?

ответ

76

Вам необходимо установить значение true, если вы хотите отправить (выход) тело запроса, например, с запросами POST или PUT. С GET вы обычно не отправляете тело, так что вам это не нужно.

Отправка само тело запроса осуществляется через выходной поток для данного соединения:

conn.getOutputStream().write(someBytes); 
+0

Что делать, если я загружаю изображение? – Jaydev

+0

Загрузка? Или загрузка? – Thilo

24

setDoOutput(true) используется для POST и PUT запросов. Если это false, то он предназначен для использования GET запросов.

+0

Возможно, также для PUT. – Thilo

+0

@Thilo - Хорошая точка. –

+1

нормально, как я могу заставить это соединение делать PUT, так как сервер с другой стороны принимает только запросы PUT, а не POST ...? –

0
public void setDoOutput(boolean dooutput) 

Он принимает значение в качестве параметра и устанавливает это значение doOutput поля для этого URLConnection к заданному значению.

URL-соединение может использоваться для ввода и/или вывода. Установите флаг DoOutput в значение true, если вы собираетесь использовать URL-соединение для вывода, false, если нет. По умолчанию используется значение false.

+3

Я читал это в документации, прежде чем спрашивать. Причина, по которой я спрашиваю, я не понимаю последствий этого. – sharptooth

+0

Если вы хотите написать объект подключения, вы должны установить serDoOutput true –

1

Добавление комментария, если у вас есть длительное соединение и вы посылаете как GETs и постам, это то, что я делаю:

if (doGet) { // some boolean 
    con.setDoOutput(false); // reset any previous setting, if con is long lasting 
    con.setRequestMethod("GET"); 
} 
else { 
    con.setDoOutput(true); // reset any previous setting, if con is long lasting 
    con.setRequestMethod("POST"); 
} 

И чтобы избежать длительного соединения, закройте его каждый раз.

if (doClose) // some boolean 
    con.setRequestProperty("Connection", "close"); 

con.connect();    // force connect request