Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

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

Delphi , Интернет и Сети , Сокеты

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

Посетитель у провайдера.
- Ой, что это у вас так крякнуло.
- Сервер наверное...


{
Присоедините следующие события к Вашему 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;

Программный код, который вы предоставили, это приложение Delphi, использующее компонент TClientSocket для отправки HTTP-запроса POST напрямую на веб-сервер или через прокси-сервер.

Вот разбивка кода:

  1. Переменная HTTP_POST хранит форматированный строковый запрос HTTP POST.
  2. Переменная FContent хранит данные, которые нужно отправить в теле запроса.
  3. Функция HTTPTran URL-кодит данные с помощью встроенных функций Delphi IntToHex и Byte.
  4. Процедура PostTheForm вызывается, когда форма должна быть отправлена. Она настраивает HTTP-запрос, рассчитывает длину содержимого и отправляет запрос с помощью метода ClientSocket1.Write.
  5. Если используется прокси-сервер, свойства Host и Port компонента TClientSocket устанавливаются соответствующими значениями.

Чтобы улучшить этот код, вы можете рассмотреть:

  • Использование более robust URL-кодирования для обработки специальных символов.
  • Добавление ошибок для случаев, когда соединение не удается или ответ недействителен.
  • Реализация поддержки других методов HTTP-запроса (например, GET, PUT, DELETE).
  • Использование более эффективного способа отправки тела запроса, например, с помощью TMemoryStream и THTTPClient.
  • Рассмотрение использования третьей-сторонней библиотеки, которая предоставляет болееadvanced функции для работы с веб-серверами.

В частности, вот как вы можете модифицировать код для отправки данных формы напрямую на веб-сервер или через прокси-сервер:

  1. Установите детали веб-сервера и прокси-сервера как константы:
const
  WebServer  = 'www.example.com';
  WebPort   = 80;
  ProxyServer = 'proxy.example.com';
  ProxyPort  = 3128;
  1. В процедуре PostTheForm, настройте HTTP-запрос соответствующим образом:
procedure T...Form.PostTheForm;
begin
  // ... (предыдущий код)

  if UseProxy then
  begin
    ClientSocket1.Host := ProxyServer;
    ClientSocket1.Port := ProxyPort;
    HTTP_POST := 'POST http://' + WebServer + PostAddr + ' HTTP/1.0'#10;
  else
  begin
    ClientSocket1.Host := WebServer;
    ClientSocket1.Port := WebPort;
    HTTP_POST := 'POST ' + PostAddr + ' HTTP/1.0'#10;
  end;

  // ... (предыдущий код)
end;

В этом примере переменная UseProxy - булевая, которая определяет, использовать ли прокси-сервер или нет. Если она установлена в True, код настраивает HTTP-запрос с использованием деталей прокси-сервера; иначе - с использованием деталей веб-сервера напрямую.

Надеюсь, это поможет! Пожалуйста, дайте мне знать, если у вас есть какие-либо дальнейшие вопросы.

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


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Сокеты ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 15:57:58/0.0037119388580322/0