Если вы извлекаете объект URLConnection
, используя openConnection()
, он фактически не начинает связываться с сервером. Этого не произойдет, пока вы не получите поток от URLConnection()
. Когда вы впервые получаете соединение, вы можете добавить / изменить заголовки и другие свойства соединения перед тем, как его открыть.
Жизненный цикл URLConnection немного странный. Он не отправляет заголовки на сервер, пока вы не получите один из потоков. Если вы просто получаете входной поток, то я считаю, что он выполняет GET, отправляет заголовки, а затем позволяет вам прочитать вывод. Если вы получаете выходной поток, то я полагаю, что он отправляет его как POST, поскольку предполагается, что вы будете записывать в него данные (вам может потребоваться вызвать setDoOutput(true)
, чтобы выходной поток работал). Как только вы получаете входной поток, выходной поток закрывается и ожидает ответа от сервера.
Например, это должен сделать POST:
URL myURL = new URL("http://example.com/my/path");
URLConnection conn = myURL.openConnection();
conn.setDoOutput(true);
conn.setDoInput(true);
OutputStream os = conn.getOutputStream();
os.write("Hi there!");
os.close();
InputStream is = conn.getInputStream();
// read stuff here
В то время как это сделает GET:
URL myURL = new URL("http://example.com/my/path");
URLConnection conn = myURL.openConnection();
conn.setDoOutput(false);
conn.setDoInput(true);
InputStream is = conn.getInputStream();
// read stuff here
URLConnection
также будет делать другие странные вещи. Если сервер задает длину контента, то URLConnection
будет держать основной входной поток открытым до тех пор, пока не получит столько данных, , даже если вы явно закроете его . Это вызвало у нас много проблем, так как сделало чистое отключение нашего клиента довольно трудным, поскольку URLConnection
оставил бы сетевое соединение открытым. Вероятно, это, вероятно, существует, даже если вы просто используете getStream()
.