Как отправить веб форму на сервер? |
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