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

Как отправить вебформу на сервер при помощи TClientSocket (напрямую и через прокси)
{
Copyright (c) 1999 by E.J.Molendijk
Присоедините следующие события к Вашему ClientSocket:
procedure TMyForm.ClientSocket1Write;
procedure TMyForm.ClientSocket1Read;
procedure TMyForm.ClientSocket1Disconnect;
procedure TMyForm.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
 TMyForm = 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 TMyForm.ClientSocket1Write(Sender: TObject; Socket: TCustomWinSocket);
begin
 // Постим данные
 Socket.SendText(HTTP_POST + FContent);
end;
procedure TMyForm.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
begin
 // Получаем результат
 FResult := FResult + Socket.ReceiveText;
end;
procedure TMyForm.ClientSocket1Disconnect(Sender: TObject; Socket: TCustomWinSocket);
begin
 // ЗДЕСЬ МОЖНО ОБРАБОТАТЬ FResult //
end;
procedure TMyForm.ClientSocket1Error(Sender: TObject;
 Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
 var ErrorCode: Integer);
begin
 ErrorCode := 0; // Игнорируем ошибки
end;
{
А эта подпрограмма, которую можно использовать для постинга данных формы.
}
procedure TMyForm.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;
Source: http://forum.sources.ru
ID: 03551
Category:Связь
Category:Сокеты