Как отправить веб форму на сервер?

Previous  Top  Next

    
 

 

Как отправить вебформу на сервер при помощи TClientSocket (напрямую и через прокси)

Code:

{

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;

 

 

©Drkb::03551

Взято из http://forum.sources.ru