На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Rouse_, jack128, Krid
  
    > Как отправить вебформу на сервер при помощи TClientSocket , напрямую и через прокси
      ExpandedWrap disabled
         
        Copyright (c) 1999 by E.J.Molendijk
         
        Присоедините следующие события к Вашему ClientSocket:
        procedure T...Form.ClientSocket1Write;
        procedure T...Form.ClientSocket1Read;
        procedure T...Form.ClientSocket1Disconnect;
        procedure T...Form.ClientSocket1Error;
         
        Так же пример показывает, как направлять передачу через прокси-сервер.
         
         
        Для отправки на вебсервер используется следующий формат:
        Напрямую: 'POST ' + PostAddr + 'HTTP/1.0' + HTTP_Data + Content
        Через проксю:  'POST http://' Webserver + PostAddr + 'HTTP/1.0' + HTTP_Data + Content
        }
         
         
        Const
          WebServer = 'www.somehost.com';
          WebPort   = 80;
          PostAddr  = '/cgi-bin/form';
         
          { Следующие переменные используются только для вебсервера: }
          ProxyServer ='proxy.somewhere.com';
          ProxyPort   = 3128;
         
          // В заголовке post необходимы некоторые данные
          HTTP_Data =
            'Content-Type: application/x-www-form-urlencoded'#10+
            'User-Agent: Delphi/5.0 ()'#10+    { Отрекламируем Delphi 5! }
            'Host: somewhere.com'#10+
            'Connection: Keep-Alive'#10;
         
        type
          T...Form = class(TForm)
            ...
          private
            { Private declarations }
            HTTP_POST   : String;
            FContent    : String;
            FResult     : String; // Эта переменная будет содержать ответ сервера
          public
            { Public declarations }
          end;
         
         
        { Эти функции сделают некоторое url-кодирование }
        { Например.   'John Smith' => 'John+Smith'  }
        function HTTPTran(St : String) : String;
        var i : Integer;
        begin
          Result:='';
          for i:=1 to length(St) do
            if St[i] in ['a'..'z','A'..'Z','0','1'..'9'] then
              Result:=Result+St[i]
            else if St[i]=' ' then
              Result:=Result+'+'
            else
              Result:=Result+'%'+IntToHex(Byte(St[i]),2);
        end;
         
        procedure T...Form.ClientSocket1Write(Sender: TObject;
          Socket: TCustomWinSocket);
        begin
          // Постим данные
          Socket.SendText(HTTP_POST+FContent);
        end;
         
        procedure T...Form.ClientSocket1Read(Sender: TObject;
          Socket: TCustomWinSocket);
        begin
          // Получаем результат
          FResult:=FResult+Socket.ReceiveText;
        end;
         
        procedure T...Form.ClientSocket1Disconnect(Sender: TObject;
          Socket: TCustomWinSocket);
        begin
          // ЗДЕСЬ МОЖНО ОБРАБОТАТЬ FResult //
        end;
         
        procedure T...Form.ClientSocket1Error(Sender: TObject;
          Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
          var ErrorCode: Integer);
        begin
          ErrorCode := 0; // Игнорируем ошибки
        end;
         
         
        {
        А эта подпрограмма, которую можно использовать для постинга данных формы.
        }
        procedure T...Form.PostTheForm;
        begin
          // Очищаем результаты
          FResult:='';
         
          // Вы можете ввести поля формы, которые необходимы
          // Вот некоторые примеры:
          FContent:=
           'Name='+    HTTPTran('John Smith')            +'&'+
           'Address='+ HTTPTran('1 Waystreet')          +'&'+
           'Email='+   HTTPTran('jsmith@somewhere.com') +'&'+
           'B1=Submit'+
           #10;
         
          // Вычисляем длину содержимого
          FContent:=
            'Content-Length: '+IntToStr(Length(FContent))+#10+#10+FContent;
         
          {-- Начало прокси ---}
          { если Вы используете прокси, то раскоментируйте этот код
          ClientSocket1.Host := ProxyServer;
          ClientSocket1.Port := ProxyPort;
          HTTP_POST := 'POST http://'+WebServer+PostAddr+' HTTP/1.0'#10;
          {--- Конец прокси ---}
         
          {--- Начало соединения напрямую --- }
          { удалите этот код, еслы Вы будете использовать прокси }
          ClientSocket1.Host := WebServer;
          ClientSocket1.Port := WebPort;
          HTTP_POST := 'POST '+PostAddr+' HTTP/1.0'#10;
          {--- Конец соединения напрямую ---}
         
          // Соединяем заголовок
          HTTP_Post := HTTP_Post + HTTP_Data;
         
          // Пытаемся открыть соединение
          ClientSocket1.Open;
        end;
      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script execution time: 0,0228 ]   [ 16 queries used ]   [ Generated: 3.05.24, 09:45 GMT ]