Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> IdHTTP - получить страницу, при коде <> 200, не отдаёт страницу при exception 
:(
    Опции темы
Snowy
Дата 3.6.2008, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



Проблема. Банальный код
Код

  with TIdHttp.Create(nil) do
  begin
    try
      Post('http://server/script.cgi', MyData, FResponse);
    except
      // ?
    end;
    Free;
  end;

Нормально отрабатывает и забирает текст при отсутствии ошибок (код 200).
Но, если скрипту не понравились переданные данные, он выдаёт код 500 и в теле страницы описание, что не так.
Вот этот текст мне и нужно получить.
Как его добыть из TIdHttp?
По мапперу я вижу, что страница получена вся. Но заставить IdHttp отдать её мне не получается.
IdHttp просто взрывает exception и отказывается отдавать что-либо, кроме очевидной цифры 500.
Но пользователю не нравится 500. Он хочет текст ошибки, переданный скриптом! :(
PM MAIL   Вверх
Matematik
Дата 4.6.2008, 00:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1027
Регистрация: 11.3.2006

Репутация: 24
Всего: 50



AFAIK
indy9 
-читает заголовок
-проверяет его
-если 200 - читает данные
Скорее всего, надо просто дочитать данные из буфера сокета. В indy9 этим занимается не public метод TIdCustomHTTP.ReadResult()


PS
у меня подобная проблема была, после исключение, данные в буфере оставались, без дисконекта делал повторный запрос и indy читал сразу 2 ответа в одном
PM MAIL WWW ICQ   Вверх
dumb
Дата 5.6.2008, 02:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 5
Всего: 158



Код

  with TIdHttp.Create(nil) do
  begin
    try
      Post('http://server/script.cgi', MyData, FResponse);
    except
      on E: EIdHTTPProtocolException do ShowMessage(E.ErrorMessage);
    end;
    Free;
  end;

PM MAIL   Вверх
Snowy
Дата 5.6.2008, 03:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



Если бы так просто...
E.ErrorMessage = ''

Но уже не актуально.
Индюка я применил, потому что Swin лагал.
Swin давал мне всю информацию. Но потом пошли лаги.
Пришлось экстренно заменит его на инди.
А инди не желает отдавать страницу.
Но уже разобрался.
Бага была в сервере. Нарушение http протокола.
Уже и сервер поправили и свин я научил обходить подобные казусы.
Даже перепробовал кучу сторонних WinHTTP библиотек - все глючат, при нарушении протокола.
Щас обучил свин обходить ошибку протокола, и проблема исчезла.
В планах доработать свин до мультитредовой поддержки http 1.1
Когда руки дойдут...
Индюки расстраивают всё больше...
Зато свинёнок лучшеет.
Попробовал альтерналиву... Не. Свинёнок лучше.
Из всех альтернатив, только индюки имеют функциональность "Дай страницу - на"
И то не универсальную.
У остальных ещё хуже. Всё на колбэках.
А свинёнок умеет и так и так. И буду ещё дорабатывать в этом направлении.
Нашёл суперкрутой компонент, который чего только не умеет. Аж глаза разбегаются.
Но задача проста - дай страницу! Компонент крут. Возможностей вагон, на любой вкус.
Но такую простую задачу решает в 20 строк кода. Асинхронного кода...
Ну это уже шиза. Свин для того и сделан - сказать "дай" - получи ответ.
Вобщем сильно расстроили меня альтернативные решения. Хотя в них нашёл много общего со свином, и тем для размышлений...
Вобщем результат приключений прост - альтернативные решения уступают индюкам.
Но индюки принципиально непробиваемы.
Они диктуют свою волю програмеру, а не наоборот.
Не могу сказать, что свин гораздо лучше индюков, но я юзаю именно его, т.к. я его строю именно так, как Я вижу работу с http.
Она должна быть гибкой для любых целей и простой для всех.
Хотя в этой простате главный минус - диагностика проблем.
Если со свином проблема - хрен её поймаешь. А в индюках всё прямолинейно.
Но мне как-то не хочется, чтобы библиотека навязывала мне свою политику и ограничения.
PM MAIL   Вверх
CodeGold
Дата 19.2.2013, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 20.12.2010

Репутация: нет
Всего: нет



столкнулся с такой же проблемой - решение не нашел!!!
PM MAIL   Вверх
Чучмек
Дата 19.2.2013, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 4
Всего: 41



Через сокеты.


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
CodeGold
Дата 19.2.2013, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 20.12.2010

Репутация: нет
Всего: нет



проще 

Код


  try
    IdHTTP1.get('https://twitter.com/sessions');
  except
    on E: EIdHTTPProtocolException do
    begin
      if E.ErrorCode = 404 then
        set_status(E.ErrorMessage)
      else
        raise;
    end;
  end;




PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.1166 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.