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

StackOverflow https://stackoverflow.com/questions/39391

  •  09-06-2019
  •  | 
  •  

Вопрос

Если я создам HTTP java.net.URL а потом позвони openConnection() исходя из этого, обязательно ли это подразумевает, что произойдет HTTP-публикация?Я знаю это openStream() подразумевает ПОЛУЧЕНИЕ.Если да, то как вы выполняете один из других HTTP-глаголов без необходимости работать с необработанным уровнем сокетов?

Это было полезно?

Решение

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top