Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Работа с сетью > HEAD запрос в HttpURLConnection


Автор: VoimiX 26.3.2007, 10:49
или я тупой или Java....

нужно оправить HEAD запрос к веб-ресурсу

чтоб просто запросить ресурс через GET делается так:

URL image_url = new URL("http://localhost/images/Slide.jpg");
HttpURLConnection http = (HttpURLConnection)image_url.openConnection();

Я так понял объект  HttpURLConnection можно получить только через вызов URL.openConnection()
да вот только какой метод указать нельзя...
конечно в HttpURLConnection есть метод setRequestMethod, но чтоб вызвать его HttpURLConnection нужно закрыть....

т.е. получается чтоб   оправить HEAD запрос нужно сделать так:

URL image_url = new URL("http://localhost/images/Slide.jpg");
HttpURLConnection http = (HttpURLConnection)image_url.openConnection();//здесь вызывается GET метод
http.disconnect();
http.setRequestMethod("HEAD");//вызываем НУЖНЫЙ НАМ МЕТОД
http.connect();

это же извращенство...

можно ли вызвать один метод HEAD???
а то получается , чтоб отправить HEAD по-любому придётся оправить GET
бред.....


Автор: AntonSaburov 26.3.2007, 14:22
Цитата(VoimiX @  26.3.2007,  10:49 Найти цитируемый пост)
конечно в HttpURLConnection есть метод setRequestMethod, но чтоб вызвать его HttpURLConnection нужно закрыть...

Это почему надо так делать ? Я честно говоря не работал с этим уже давно - но почему нельзя-то ?

Автор: nagliyvred 2.4.2007, 22:29
С чего Вы взяли что при вызове url.openConnection() выполняется GET-запрос? HTTP это же прикладной протокол. Насколько я понимаю (гуру поправьте если неправ) вызов этого метода просто открывает сокет и создает соединение. А что вы в этот сокет потом запишите GET <url> HTTP\1.1 или HEAD <url> HTTP\1.0 или что-то еще -  на данном этапе ничем не определено. После того как сокет открыт делайте setRequestMethod("HEAD"); и все остальное - должно работать

Автор: kkorsakoff 3.4.2007, 10:28
url.openConnection()  по-умолчанию выполняет именно GET-запрос. Если указать setDoOutput() - то запрос будет POST. Вызов openConnection() то может и просто открывает сокет, но при первом же вызове getOutputStream() или getInputStream() он передает GET <url> HTTP\1.1 и всякие заголовки.

Так что нельзя писать туда что угодно, первую строку METHOD <url> HTTP/1.1 и заголовки UrlConnection делает сам.

Почему нельзя задать метод setRequestMethod()? Надо его вызвать не на закрытом запросе, а на НЕ открытом.

Смотрим исходники

Код

    public void setRequestMethod(String method) throws ProtocolException {
    if (connected) {
        throw new ProtocolException("Can't reset method: already connected");
    }
    // This restriction will prevent people from using this class to 
    // experiment w/ new HTTP methods using java.  But it should 
    // be placed for security - the request String could be
    // arbitrarily long.

    for (int i = 0; i < methods.length; i++) {
        if (methods[i].equals(method)) {
        this.method = method;
        return;
        }
    }
    throw new ProtocolException("Invalid HTTP method: " + method);
    }


Автор: nagliyvred 4.4.2007, 00:09
Цитата(kkorsakoff @ 3.4.2007,  10:28)
url.openConnection()  по-умолчанию выполняет именно GET-запрос. Если указать setDoOutput() - то запрос будет POST. Вызов openConnection() то может и просто открывает сокет, но при первом же вызове getOutputStream() или getInputStream() он передает GET <url> HTTP\1.1 и всякие заголовки.

Так что нельзя писать туда что угодно, первую строку METHOD <url> HTTP/1.1 и заголовки UrlConnection делает сам.

Почему нельзя задать метод setRequestMethod()? Надо его вызвать не на закрытом запросе, а на НЕ открытом.

То что по-умолчанию методом является GET это понятно и, наверно я неправильно выразился, но я не имел ввиду что нужно будет руками загонять в сокет строку запроса. Я хотел сказать что в зависимости от того что потом будет передано во всякие setRequestMethod()'ы,  setRequestProperty() и прочие -  такой запрос и будет сформирован, и на момент вызова URL.openConnection() все эти параметры еще никуда  не отправлены.

Автор: kkorsakoff 4.4.2007, 01:04
Тогда надо использовать простые сокеты.

Ну или Apache HttpClient, где все делается легко и простоsmile
Хотя странно, что у автора не получилось и так?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)