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


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


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

Взято с Исходников.ru http://www.sources.ru




DELPHI FAQ




EOMY TOP 100      Рейтинг@Mail.ru      Rambler's Top100