Новый URL (...). OpenConnection() обязательно подразумевает POST?

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

Ответ 1

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

Ответ 2

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

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