Новый URL (...). OpenConnection () обязательно подразумевает POST? - PullRequest
10 голосов
/ 02 сентября 2008

Если я создаю HTTP java.net.URL и затем вызываю openConnection(), означает ли это, что обязательно будет сообщение HTTP? Я знаю, что openStream() подразумевает GET. Если да, как вы выполняете один из других HTTP-глаголов без необходимости работать со слоем необработанных сокетов?

Ответы [ 2 ]

16 голосов
/ 02 сентября 2008

Если вы извлекаете объект 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().

3 голосов
/ 02 сентября 2008

Нет, это не так. Но если протокол URL-адреса HTTP, вы получите HttpURLConnection в качестве возвращаемого объекта. В этом классе есть метод setRequestMethod, чтобы указать, какой метод HTTP вы хотите использовать.

Если вы хотите делать более сложные вещи, вам лучше использовать такую ​​библиотеку, как Jakarta HttpClient .

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