Synapse даст Indy по голове?

Тема в разделе "Статьи", создана пользователем Robo, 24 авг 2010.

  1. Robo
    Robo Guest
    Часть первая. Вступительная.

    Здравствуй читатель. Прежде всего хочу попросить прощения у Рыжего. Именно ему я давным-давно обещал написать этот материал. С днём роэдения тебя, кстати! Рости большой и все дела... Ты уж меня прости, что я так долго (месяца два прошло, насколько я помню). Но ты же меня всё равно “любишь”, правда :D ?

    Что такое 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 или нет.
     
    Последнее редактирование модератором: 24 авг 2010
    24 авг 2010
    2 пользователям это понравилось.
  2. ~|~евто|-|
    ~|~евто|-| Silentium Новичок
    Симпатии:
    32
    Robo, :))
    1. Заголовок для желтой газетенки.
    2. Не описал самого главного, что отличает synapse от indy... Например, поддержка TSL/SSL.
    3. За Form1 пальцы под каток) Но вижу осилил таки блок try, правда про except видно не дочитал :))
     
    24 авг 2010
  3. Robo
    Robo Guest
    Дочитал, точно говорю (дочитал давненько кстати). Ты наверное про освобождение памяти мне хотел тыкнуть?! )) :D За Form1 - это я проверял, просто, чтоб без лишних заморотов, пример ж. Во флудере ответов всё замечательно ;)
     
    24 авг 2010
  4. ~|~евто|-|
    ~|~евто|-| Silentium Новичок
    Симпатии:
    32
    Код:
    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 :))
     
    24 авг 2010
  5. Robo
    Robo Guest
    Точно, спасибо, поправил )
     
    24 авг 2010
  6. NOCaut
    NOCaut Новичок
    Симпатии:
    0
    Помогите переделать код для регистрации в facebook. Спасибо!
     
    1 июн 2011
Загрузка...