Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Java: Работа с сетью > URLConnection: java.net.ProtocolException |
Автор: T_Serg 5.8.2009, 15:29 | ||
Перед созданием POST запроса к серверу необходимо прочитать контент странички. Это необходимо для того, чтобы узнать поле name тегов, которые нужно послать с пост запросом (при каждом обращении к страничке генерируется новое значение поля name необходимого тега) Я пытаюсь cделать так:
В результате получаю java.net.ProtocolException: Cannot write output after reading input. at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(Unknown Source) Возможно ли в одном соединении URLConnection делать и get и post запросы? |
Автор: COVD 5.8.2009, 18:13 |
нет |
Автор: T_Serg 6.8.2009, 09:23 |
а другими способами это возможно реализовать? например апачевским HTTPClient? |
Автор: COVD 6.8.2009, 12:53 |
URLConnection по возможности использует одно физическое соединение при повторных обращениях к одному хосту (если не применять disconnect() после каждого запроса), хотя обьект URLConnection надо каждый раз создавать новый. Это, наверное, вводит в заблуждение. Применять HttpClient нет необходимости. |
Автор: COVD 6.8.2009, 17:41 | ||||||
LSD, спасибо. Моя ошибка :( . Для повторных запросов используется тот же обьект HttpURLConnection. PS. Тут действительно как-то непонятно. Для каждого нового запроса создается новый обьект HttpURLConnection, но где-то в глубине хранятся сокетные соединения, которые могут быть использованы повторно. Так сказано в документации. Однако меня смутила строка из документации к методу disconnect() :
Непонятно, как инстанс HttpURLConnection вообще можно использовать повторно. Это одноразовый обьект, создаваемый для одного запроса. Вторую фразу, наверное, можно понимать как "не думайте, что применение disconnect() позволит повторно использовать обьект". В смысле, что это невозможно никогда. PPS
http://java.sun.com/j2se/1.5.0/docs/api/java/net/HttpURLConnection.html
|
Автор: T_Serg 7.8.2009, 10:26 | ||
Я попробовал сделать как советуете:
Для некоторых сайтов это подходит. Контент совпадает и генериремые поля тегов совпадают. Для не которых это вариант не подошел (для google.com). Как найти универсальное решение? Может что то можно изменить в исходнике класса URLConnection? |
Автор: COVD 7.8.2009, 15:07 | ||||
google.com всего лишь вставляет в страницу уникальные для каждого запроса ключи.
Программа выдает:
Запросы разные и в каждом ответе оригинальное значение ключа, а физическое соединение одно. Или не одно. Если сервер не поддерживает keepAlive, то на каждый запрос будет создаваться новое соединение. Но это скрыто от программиста. Программист работает с запросом. Необязательно использовать один и тот же обьект URL. Его можно создавать заново для каждого запроса. Если хост запросов одинаковый, то будет использоваться одно shared сокетное соединение (если сервер поддерживает этот режим и соединение не закрывается явно командой disconnect() на клиенте ). |
Автор: LSD 7.8.2009, 17:44 |
Ну там написанно may be, так что я понимаю это implementation specific. Ну и плюс используемая версия протокола. Имхо если уж так важен keep-alive, то я бы рекомендовал HttpClient, там над этим больше контроля. |