Часть первая. Вступительная. Здравствуй читатель. Прежде всего хочу попросить прощения у Рыжего. Именно ему я давным-давно обещал написать этот материал. С днём роэдения тебя, кстати! Рости большой и все дела... Ты уж меня прости, что я так долго (месяца два прошло, насколько я помню). Но ты же меня всё равно “любишь”, правда ? Что такое Synapse и почему именно он? Synapse – библиотека классов и функций, которая существенно упрощает программирование сети на прикладном уровне с использованием WinSock. На первый взгляд может показаться, что создание такой библиотеки неоправданно, так как существует огромное количество бесплатных Delphi компонентов и библиотек, которые предназначены для работы с сетью, однако стоит заметить, что почти все они используют асинхронные методы, в то время как Synapse работает в синхронном режиме. Некоторые возможности библиотеки Synapse: • Synapse не является набором компонент для Delphi, это библиотека классов и функций. Не требует установки. Просто добавьте нужные модули в раздел uses вашего проекта. • Работает как в Windows, так и в Linux. • Поддерживаются: Delphi, C++Builder, Kylix и FreePascal. • Поддержка TCP, UDP, ICMP и RAW протоколов. • Поддержка HTTP, POP3, SMTP, ESMTP, NTP, FTP, TFTP и LDAP протоколов. Библиотека Synapse поддерживает следующие платформы: • Delphi 3-7 • Delphi 2005-2007 • C++Builder 6-2007 • Kylix 1-3 • FreePascal 2.x.x Ссылки на Synapse: Официальный сайт проекта Synapse Synapse на блоге бесплатных Delphi компонентов Что можно сделать с помощью библиотеки Synapse? Да всё, что угодно! Различные серверы (FTP, HTTP, SNMP, SNTP) плюс клиенты. Работа с почтой, с протоколом ECHO (RFC 862) и многое другое. Следует учесть, что Synapse работает с WinSock второй версии (WinSock2 – Win9x, NT4 и выше), так что если вам нужно работать с этой библиотекой под операционной системой Windows 95, вам придётся скачать у Microsoft WinSock2 и распространять ее в одном дистрибутиве вместе с вашей программой. Под операционной системой Linux, некоторые процедуры и функции библиотеки могут потребовать привелегий суперпользователя. Часть вторая. Рабочая. Разберёмся в основных, повседневный операциях при работе с HTTP-серверами, а именно отправкой POST & GET запросов с использованием библиотеки Synapse. Прежде всего к своему Delphi-проекту необходимо подключить модуль HTTPSend из пакета Synapse. После чего посмотрим на основные процедуры и функции: В основе всего стоит главный класс – THTTPSend. У класса есть универсальный метод HTTPMethod. В зависимости от первого параметра ('GET' или 'POST') он может отправлять нужный запрос. Попробуем с GET. Код: procedure TForm1.GetIndex; var Http:THTTPSend; begin Http:=THTTPSend.Create; try if Http.HTTPMethod('GET','https://xaker.name') then ShowMessage('''Get'''); finally Http.Free; end; end; После выполнения данного метода, в поле “Document” объекта “Http” будет содержатся главная страница требуемого сайта. Так как в GET-запросе параметры передаются через URL – мы можем использовать и URL с параметрами. Например: Код: procedure TForm1.GetRijyBirthday; var Http:THTTPSend; Data:TMemoryStream; begin Http:=THTTPSend.Create; try if Http.HTTPMethod('GET','http://www.xaker.name/forvb/showthread.php?p=129319') then Http.Document.SaveToFile('D:\ RijyBirthday.htm'); finally Http.Free; end; end; Всё просто, получаем страницу и можем работать с ней дальше. Теперь POST-запросы. Прежде всего, для POST-запроса необходимо заполнить поля объекта. Я не буду расписывать какие поля и для чего их заполнять, так как все, кто работал с Indy, и так прекрасно их знают. Ну а кто не работал, простите xD. Рассмотрим программный логин на сервисе “Ответы Mail.ru”: Код: procedure TForm1.Login; var HTTP:THTTPSend; Data:TStringStream; NewUrl:String; begin HTTP := THTTPSend.Create; Data := TStringStream.Create(''); try HTTP.UserAgent := 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.4)'+ 'Gecko/20100611 Firefox/3.6.4'; HTTP.KeepAlive := True; HTTP.TargetPort := '80'; HTTP.TargetHost := 'swa.mail.ru'; HTTP.Protocol :='1.1'; HTTP.MimeType :='application/x-www-form-urlencoded'; { Данные необходимые для логина } Data.WriteString('Page=http://otvet.mail.ru/login/?url=http://otvet.mail.ru/'); Data.WriteString('&Login=name'); Data.WriteString('&Domain=mail.ru'); Data.WriteString('&Password=mypassword'); HTTP.Document.LoadFromStream(Data); { далее парсим редирект } if HTTP.HTTPMethod('POST','http://swa.mail.ru/cgi-bin/auth') then begin NewUrl :=StringReplace(HTTP.Headers.Strings[6],'Location:','',[]); HTTP.Document.Clear; HTTP.Headers.Clear; HTTP.TargetHost:='win.mail.ru'; if HTTP.HTTPMethod('GET',NewUrl) then begin NewUrl :=StringReplace(HTTP.Headers.Strings[6],'Location:','',[]); HTTP.Document.Clear; HTTP.Headers.Clear; HTTP.TargetHost:='otvet.mail.ru'; if HTTP.HTTPMethod('GET','http://otvet.mail.ru') then HTTP.Document.SaveToFile('D:\LoginToParse.html'); end; end; finally Data.Free; HTTP.Free; end; end; Это процедура логина. Результат запроса сохраняется в поле “Document”. Я сохраняю его в файл LoginToParse, но правильнее было бы распарсить его на предмет вхождения строки с нашим e-mail адресом. Если он там, то логин успешен. Заголовки придут в “Headers”, а куки в “Cookies”. Всё просто. Что ещё сказать? Похоже на Indy. Единственное, что удручает – это отсутствие такого удобного свойства, как автоматические хендлинг редиректов. Ну знаете, как в Indy “idHTTP.HandleRedirects := True”, использование, которого избавляет от рутинной работы вида: Код: { далее парсим редирект } if HTTP.HTTPMethod('POST','http://swa.mail.ru/cgi-bin/auth') then begin NewUrl :=StringReplace(HTTP.Headers.Strings[6],'Location:','',[]); HTTP.Document.Clear; HTTP.Headers.Clear; HTTP.TargetHost:='win.mail.ru'; if HTTP.HTTPMethod('GET',NewUrl) then begin NewUrl :=StringReplace(HTTP.Headers.Strings[6],'Location:','',[]); HTTP.Document.Clear; HTTP.Headers.Clear; HTTP.TargetHost:='otvet.mail.ru'; if HTTP.HTTPMethod('GET','http://otvet.mail.ru') then HTTP.Document.SaveToFile('D:\LoginToParse.html'); end; end; Это пожалуй единственный минус Synapse. Кстати, думаю что в скором времени автор библиотеки добавит такую возможность, так как в виш-листе на их сайте я уже изъявил своё желание. Думаю, что не я один этого хочу. Часть третья. Заключительная. Кстати, HTTPSend предоставляет несколько полезных функций для более удобной и быстрой работы с повседневными операциями: Код: function HttpGetText(const URL: string; const Response: TStrings): Boolean; function HttpGetBinary(const URL: string; const Response: TStream): Boolean; function HttpPostBinary(const URL: string; const Data: TStream): Boolean; function HttpPostURL(const URL, URLData: string; const Data: TStream): Boolean; function HttpPostFile(const URL, FieldName, FileName: string; Как видите, названия функций более чем “говорящие”, поэтому описывать их здесь просто не имеет смысла. Но если что, всего можно обратиться к справке по этой замечательной библиотеке. Synapse vs Indy? Хмм… Indy тоже очень хорошая библиотека, но со своими жуками. Так что, делайте выбор сами, переходить вам на Synapse или нет.
Robo, ) 1. Заголовок для желтой газетенки. 2. Не описал самого главного, что отличает synapse от indy... Например, поддержка TSL/SSL. 3. За Form1 пальцы под каток) Но вижу осилил таки блок try, правда про except видно не дочитал )
Дочитал, точно говорю (дочитал давненько кстати). Ты наверное про освобождение памяти мне хотел тыкнуть?! )) За Form1 - это я проверял, просто, чтоб без лишних заморотов, пример ж. Во флудере ответов всё замечательно
Код: procedure TForm1.Login; var HTTP:THTTPSend; Data:TStringStream; NewUrl:String; begin HTTP := THTTPSend.Create; Data := TStringStream.Create(''); try ... finally HTTP.Free; Data.Free; end; end; Старайся чистить память, в обратном порядке от того как ее выделял) Иначе можно поймать ой! в finally )