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

public class Test {

    public class A {}

    public class B extends A {}

    public class C extends B {}

    public void testCoVariance(List<? extends B> myBlist) {
        B b = new B();
        C c = new C();
        myBlist.add(b); // does not compile
        myBlist.add(c); // does not compile
        A a = myBlist.get(0); 
    }

    public void testContraVariance(List<? super B> myBlist) {
        B b = new B();
        C c = new C();
        myBlist.add(b);
        myBlist.add(c);
        A a = myBlist.get(0); // does not compile
    }
}
10
задан Tom11 3 February 2016 в 12:44
поделиться

2 ответа

Если Вы получаете URLConnection объектное использование openConnection() это на самом деле не начинает связываться с сервером. Этого не происходит, пока Вы не получаете поток от URLConnection(). Когда Вы сначала получаете соединение, можно добавить/изменить заголовки и другие свойства соединения прежде на самом деле открыть его.

Жизненный цикл URLCONNECTION немного нечетен. Это не отправляет заголовки на сервер, пока Вы не получили один из потоков. Если Вы просто получаете входной поток затем, я полагаю, что он делает ПОЛУЧЕНИЕ, отправляет заголовки, то позволяет Вам считать вывод. Если Вы получаете поток вывода затем, я полагаю, что он отправляет его как 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

В то время как это сделало бы ПОЛУЧЕНИЕ:

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() все же.

16
ответ дан 3 December 2019 в 20:07
поделиться

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

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

3
ответ дан 3 December 2019 в 20:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: