Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.12.2009, 17:12   #1
Alamo
 
Регистрация: 03.12.2009
Сообщений: 5
По умолчанию Как работает передача данных в IdHTTP?

Здравствуйте, вот после многолетнего перерыва решил начать програмить, но понял что все заросло толстым слоем грязи.
Есть у нас железяка, файрволл, чтобы поиметь выход в инет надо залогиниться, и через некоторое время логиниться надо снова. Процесс происходит простым образом - вводишь в поле на серваке имя_логина, жмешь кнопуек, выводится следующая страница, вводишь имя_пароля, жмешь кнопуек, выводится следующая страница, выбираешь из радиокнопок 1 из 3 вариантов, жмешь кнопуек. Работаешь. Потом заново.
А теперь внимание вопрос: при передаче данных на сервер с помощью пост, "кнопку надо нажимать" или она автоматом считается нажатой и сервер ждет данных со второй страницы? И как работать с радиокнопками?
В общем я не пойму никак механизьма работы с етой компонентой. Да и для контроля того, как происходит передача надо с вебброузер работать (это просто чтоб посмотреть что передалось), а я чойтоть по интернет передаче данных (да и вообще по программингу) лопух, помогите разобраться, истина где то рядом бродит, все вроде понимаю, но пробелы в знаниях мешают получить желаемое.
Alamo вне форума Ответить с цитированием
Старый 03.12.2009, 20:24   #2
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

http://programmersforum.ru/showthread.php?t=38803
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 04.12.2009, 11:15   #3
Alamo
 
Регистрация: 03.12.2009
Сообщений: 5
По умолчанию

Хм... вопрос в том что у меня хидден, + по радиобаттонам ничо не нашел, как на них выбирать програмно какую кнопку "нажатую" отправлять в запросе. По аналогиям я цифры думаю, но пока не совсем уверен.
Alamo вне форума Ответить с цитированием
Старый 06.12.2009, 00:51   #4
AquaKlaster
Delphi,Python,PHP
Форумчанин
 
Аватар для AquaKlaster
 
Регистрация: 04.04.2009
Сообщений: 138
По умолчанию

Цитата:
Сообщение от Alamo Посмотреть сообщение
Хм... вопрос в том что у меня хидден, + по радиобаттонам ничо не нашел, как на них выбирать програмно какую кнопку "нажатую" отправлять в запросе. По аналогиям я цифры думаю, но пока не совсем уверен.
Берите снифер в руки и идите на сайт, там уже отслеживайте пост запрос снифером, и всё станет ясным как Божий день!!!
AquaKlaster вне форума Ответить с цитированием
Старый 09.12.2009, 10:16   #5
Alamo
 
Регистрация: 03.12.2009
Сообщений: 5
По умолчанию

Что получаем в дебугере при отправке через броузер (Request Stream)

POST / HTTP/1.1
Host: 192.168.0.4:900
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ru,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://192.168.0.4:900/
Content-Type: application/x-www-form-urlencoded
Content-Length: 41

ID=7c6f004d93df&STATE=1&DATA=S.D.Lo ginenz
(на то что стоит после ID= не обращайте внимания - оно все равно изменяется при каждом коннекте и это я ловлю)

Что получаем в дебугере при отправке через программу (Request Stream)

POST / HTTP/1.0
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 53
Host: 192.168.0.4:900
Accept: text/html, */*
User-Agent: Mozilla/3.0 (compatible; Indy Library)

ID=e4912e8df141%26STATE%3D1%26DATA% 3DS%2ED%2ELoginenz

Так вот несколько вопросов:
1) Как будет выглядеть строка которую читаем в дебугере для вебсервера? (POST / HTTP/1.1&Host: 192.168.0.4:900&...) или еще как? В общем меня интересует формирование строки для отправки через создаваемую программу подобной той которая отправляется через броузер - как это делается? Что из этих данных действительно поймано при отправке, а что дописано самим дебугером? (например вместо POST / HTTP/1.1&Host: 192.168.0.4:900&... идет HTTP/1.1&192.168.0.4:900&...)
2) Какие символы идут вместо пробелов в строке? Или по поводу каких либо символов не стоит особо заморачиваться и программа "сама поймет" что и как ей сформировать и сформированное ей будет принято вебсервером?
3) В ходе вылавливания изменяемого содержимого в ID= ... используется у меня тип переменной PChar - не сбивается ли из-за нее последняя строка, где вместо амперсандов стоят проценты?
(просто для проверки правильно ли сформировалась строка я конечный результат вставлял в листбокс и в нем получал строку идентичную той что отправляется на сервер через вебброузер (ID=7c6f004d93df&STATE=1&DATA=S.D.L oginenz))
4) Почему при получении в RichEdit кода страницы методом Get пишет HTTP/1.1? а при использовании для отправки строки методом Post пишет HTTP/1.0? (При отправке через броузер дебугер выдает HTTP/1.1)

Если что напутано или непонятно не серчайте сильно - я просто не знаю какие запросы для поиска по темам форума сформировать чтобы спросить что надо, а на просмотр тем подряд времени не хватает, так как занимаюсь этой прогой в свободное от основной работы время.
Alamo вне форума Ответить с цитированием
Старый 18.05.2010, 16:00   #6
Alamo
 
Регистрация: 03.12.2009
Сообщений: 5
По умолчанию

первая страничка для ввода имени пользователя, dcb1cd18467b генерится постоянно заново, но это я отлавливаю:
<FORM METHOD="POST">
о чём говорит эта строка для программиста и какие ещё METHOD могут быть и в чём их разница для дельфиста?
<INPUT TYPE="hidden" NAME="ID" VALUE="dcb1cd18467b"> <P>
<INPUT TYPE="hidden" NAME="STATE" VALUE="1"><P>
Хиддены заполняются автоматически, пользователь про них и знать не знает, верно я понимаю?
FireWall-1 message: User: <p> <P>
Input: <INPUT NAME="DATA"> <P>
Please press 'Submit' when done: <INPUT TYPE="submit"
VALUE="Submit">. <P>

А вот про эти выделенные жирным строчки я немного не понял: в TStringList.Add(что здесь вставить?) и сколько этих .Add нужно?

потом вторая страничка для ввода пароля:
<FORM METHOD="POST">
<INPUT TYPE="hidden" NAME="ID" VALUE="dcb1cd18467b"> <P>
<INPUT TYPE="hidden" NAME="STATE" VALUE="2"><P>
FireWall-1 message: password: <p> <P>
Password: <INPUT TYPE="PASSWORD" NAME="DATA"> <P>
Please press 'Submit' when done <INPUT TYPE="submit"
VALUE="Submit">. <P>

третья страничка для выбора типа авторизации/деавторизации
<FORM METHOD="POST">
<INPUT TYPE="hidden" NAME="ID" VALUE="dcb1cd18467b"> <P>
<INPUT TYPE="hidden" NAME="STATE" VALUE="3"> <P>
FireWall-1 message: User S.D.Loginenz authenticated by FireWall-1 authentication
<p><P>
<U>Methods:</U><P>
<INPUT TYPE="radio" NAME="DATA" VALUE="1" checked><I>Standard Sign-on</I><BR>
<INPUT TYPE="radio" NAME="DATA" VALUE="2"><I>Sign-off</I><BR>
<INPUT TYPE="radio" NAME="DATA" VALUE="3"><I>Specific Sign-on</I><BR>
Select a method, then press 'Submit': <INPUT TYPE="submit"
VALUE="Submit">. <P>
здесь нужно из радиокнопок значение 1 где.
ну и финальная информационная без <INPUT-ов, просто информационная
FireWall-1 message: User authorized for standard services (XX rules)<BR><P>
<BLINK> End session. </BLINK>


вот код моей попытки авторизоваться, если не правильно то поправьте:
Application.onMinimize:=OnMinimizeP roc;
StList:=TStringList.Create;//создаём в мозгу
RichEdit1.Text:=idhttp1.Get('http://192.168.0.4:900'); //получаем страницу
GetMem(Buffer,Length(RichEdit1.Line s.Strings[14])); //берём строку с изменяемыми значениями
StrCopy(Buffer, PChar(RichEdit1.Lines.Strings[14])+38); //отсекаем
StrLCopy(Buffer,Buffer,12); //отбираем изменяемые данные
StList.Add('ID=' + buffer);//с изменёнкой
StList.Add('STATE=1');//номер страницы 1 из 3
StList.Add('DATA=S.D.Loginenz');//Логин
Label1.Caption := StList.Text; //смотрим какая строка получилась
idhttp1.Post('http://192.168.0.4:900',StList);//отправляем
StList.Clear;//чистим

StList.Add('ID='+ buffer);//с изменёнкой
StList.Add('STATE=2');//номер страницы 2 из 3
StList.Add('DATA=Loginenz');//пароль
Label2.Caption := StList.Text;//смотрим какая строка получилась
idhttp1.Post('http://192.168.0.4:900',StList);//отправляем
StList.Clear;//чистим

StList.Add('ID='+buffer);//с изменёнкой
StList.Add('STATE=3');//номер страницы 3 из 3
StList.Add('DATA=1');//Радиокнопка со значением 1
Label3.Caption := StList.Text;//смотрим какая строка получилась
idhttp1.Post('http://192.168.0.4:900',StList);//отправляем
StList.Free;//чистим мозг
FreeMem(Buffer);//чистим мозг

Ошибок нет, программа не вылетает, но авторизации не происходит, помогите, люди добрые, разобраться!
Alamo вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
передача данных bbk_serg БД в Delphi 6 15.04.2009 14:23
Передача данных по ЛС PONKA Работа с сетью в Delphi 1 27.11.2008 09:57
Как работает "Удаленный модуль данных"? kiber0net0 Общие вопросы Delphi 0 08.10.2008 12:43
Передача данных Ivanich JavaScript, Ajax 1 29.04.2008 00:25