Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

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

01.01.2007

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

{ 
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;

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