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

Материал из DRKB


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