Шаг 43.
Пример использования компонента TNMHTTP

    На этом шаге мы рассмотрим пример использования компонента TNMHTTP.

    Создадим новое приложение Delphi. Поместим на форму нового приложения одно окно редактирования, четыре компонента ТМеmо, семь командных кнопок и компоненты TNMHTTP и TOpenDialog. Форма приложения приведена на рисунке 1.


Рис.1. Внешний вид приложения

    Очистим, как всегда, содержимое окна редактирования и полей мемо. Добавим на форму несколько меток, поясняющих назначение остальных компонентов на форме. В поле редактирования будем указывать URL - первый параметр для методов компонента. Семь командных кнопок будут вызывать методы Get, Head, Options, Trace, Put, Post и Delete. Ниже приведены обработчики события OnClick кнопок, вызывающих методы Trace, Put и Post.

procedure TForm1.Button4Click(Sender: TObject);
//Trace
var
  S1: String;
begin
  if InputQuery('Отладка', 'Введите отладочные данные для отправки',S1) then
      NMHTTP1.Trace(Edit1.Text, S1);
end;

procedure TForm1.Button5Click(Sender: TObject);
//Put
begin
  if OpenDialog1.Execute then
  begin
    NMHTTP1.OutputFileMode := true;
    NMHTTP1.Put(Edit1.Text,OpenDialog1.FileName);
    NMHTTP1.OutputFileMode := False;
  end;
end;

procedure TForm1.Button6Click(Sender: TObject);
//Post
var
  S1: String;
begin
  if InputQuery('Ввод данных для опубликования в Web', 
      'Введите публикуемые данные', S1) then
    NMHTTP1.Post(Edit1.Text, S1);
end;

    Для остальных кнопок обработчики события OnClick занимают одну строку. Хотя и для этих трех методов все достаточно ясно - с помощью окон диалога или окна открытия файла нам нужно задать второй параметр этих методов, который определяет данные, передаваемые на сервер.

    В первые два поля мемо будет помещаться информация из свойств Header и Body, когда данные будут доставляться с сервера. В третьем мемо-поле будет выводиться информация о результатах выполнения методов, а в последнее поле будет помещаться то, что по-английски называется cookie и в буквальном переводе означает домашнее печенье, булочки. Говорят, что термин пришел из мультяшки, в которой герои, съев некие специальные cookies, получали волшебные способности обмена мыслями и т.д.

    В нашем случае cookie - это короткие текстовые файлы, которые готовит и посылает вам Web-сервер. Он же анализирует свои cookies, посланные вам ранее. Все это делается сервером для того, чтобы знать историю общения данного пользователя с сервером, и по возможности, улучшить обслуживание клиента. С другой стороны, можно сказать, что с помощью cookies собирается конфиденциальная информация об интересах пользователя, которая может быть использована тем или иным образом. И уже известны случаи обращения в суд по поводу коммерческого использования этой конфиденциальной информации недобросовестными фирмами. Поскольку cookie приходят тогда, когда это сочтет нужным сервер, в нашем примере это окно может остаться пустым. Но если такой файл будет получен, вы его увидите в компоненте ТМеmо, куда он переписывается из свойства CookieIn.

    Далее нам остается рассмотреть обработчики событий компонента TNMHTTP. Начнем с обработчика события OnAuthenticationNeeded. Событие происходит при работе с документом, для которого требуется идентификация пользователя. Необходимые данные об имени пользователя и пароле вводятся из окон диалога, после чего полученные значения присваиваются свойствам UserID и Password из составного свойства HeaderInfo. Кстати, в этом же свойстве лежит свойство Cookie, в которое помещаются файлы cookie, полученные вами ранее и отправляемые на сервер в запросе HTTP. После ввода информации о пользователе вам предлагается повторить предыдущую команду:

procedure TForm1.NMHTTP1AuthenticationNeeded(Sender: TObject);
var
  AnID,
  APass:   String;
begin
  InputQuery('Требуется идентификация пользователя', 
        'Введите имя пользователя', AnID);
  InputQuery('Требуется идентификация пользователя', 
        'Введите пароль', APass);
  NMHTTP1.HeaderInfo.UserID := AnID;
  NMHTTP1.HeaderInfo.Password := APass;
  ShowMessage('Данные для регистрации введены, пожалуйста, 
        повторите предыдущую команду');
end;

    Следующий обработчик события OnFailure, выводит соответствующие сообщения об ошибках:

procedure TForm1.NMHTTP1Failure(Cmd: CmdType);
begin
  Memo1.Text := NMHTTP1.Header;
  Memo2.Text := NMHTTP1.Body;
  case Cmd of
   CmdGET: Memo3.Lines.Add('Ошибка метода GET');
   CmdPOST: Memo3.Lines.Add('Ошибка метода Post');
   CmdHEAD: Memo3.Lines.Add('Ошибка метода HEAD');
   CmdOPTIONS: Memo3.Lines.Add('Ошибка метода OPTIONS');
   CmdTrace: Memo3.Lines.Add('Ошибка метода TRACE');
   CmdPut: Memo3.Lines.Add('Ошибка метода PUT');
   CmdDelete: Memo3.Lines.Add('Ошибка метода Delete');
   end;
end;

    Дальше приведен обработчик события OnSuccess, в котором на экран выводятся полученные cookies, также полученные заголовки и тела сообщений и выводится строка об успешном выполнении заданной команды:

procedure TForm1.NMHTTP1Success(Cmd: CmdType);
begin
  if NMHTTP1.CookieIn <> '' then
     Memo4.Text := NMHTTP1.CookieIn;
     Case Cmd of
       CmdGET:
           begin
             Memo1.Text := NMHTTP1.Header;
             Memo2.Text := NMHTTP1.Body;
             Memo3.Lines.Add('Метод GET успешно выполнен');
           end;
       CmdPOST:
           begin
            Memo1.Text := NMHTTP1.Header;
            Memo2.Text := NMHTTP1.Body;
            Memo3.Lines.Add('Метод POST успешно выполнен');
           end;
       CmdHEAD:
           begin
            Memo1.Text := NMHTTP1.Header;
            Memo2.Text := NMHTTP1.Body;
            Memo3.Lines.Add('Метод HEAD успешно выполнен');
           end;
        CmdOPTIONS:
           begin
            Memo1.Text := NMHTTP1.Header;
            Memo2.Text := NMHTTP1.Body;
            Memo3.Lines.Add('Метод OPTIONS успешно выполнен');
           end;
        CmdTrace:
           begin
            Memo1.Text := NMHTTP1.Header;
            Memo2.Text := NMHTTP1.Body;
            Memo3.Lines.Add('Метод TRACE успешно выполнен');
           end;
        CmdPut:
           begin
            Memo1.Text := NMHTTP1.Header;
            Memo2.Text := NMHTTP1.Body;
            Memo3.Lines.Add('Метод PUT успешно выполнен');
           end;
        CmdDelete:
           begin
            Memo1.Text := NMHTTP1.Header;
            Memo2.Text := NMHTTP1.Body;
            Memo3.Lines.Add('Метод DELETE успешно выполнен');
           end;
        end;
end;

    Следующая процедура позволит вам, если захотите, избежать перенаправления на другой сервер.

procedure TForm1.NMHTTP1Redirect(var Handled: Boolean);
begin
  If MessageDlg('Сервер перенаправляет вас на другой сайт. Будем переходить?', 
        mtConfirmation, [mbYes, mbNo], 0) = mrNo then
     Handled := true;
end;

    Ниже приводится листинг нашего примера.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Psock, NMHttp;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Memo1: TMemo;
    Memo2: TMemo;
    Memo3: TMemo;
    Memo4: TMemo;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    Button7: TButton;
    OpenDialog1: TOpenDialog;
    NMHTTP1: TNMHTTP;
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
    procedure NMHTTP1AuthenticationNeeded(Sender: TObject);
    procedure NMHTTP1Failure(Cmd: CmdType);
    procedure NMHTTP1Success(Cmd: CmdType);
    procedure NMHTTP1Redirect(var Handled: Boolean);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button4Click(Sender: TObject);
//Trace
var
  S1: String;
begin
  if InputQuery('Отладка', 'Введите отладочные данные для отправки',S1) then
      NMHTTP1.Trace(Edit1.Text, S1);
end;

procedure TForm1.Button5Click(Sender: TObject);
//Put
begin
  if OpenDialog1.Execute then
  begin
    NMHTTP1.OutputFileMode := true;
    NMHTTP1.Put(Edit1.Text,OpenDialog1.FileName);
    NMHTTP1.OutputFileMode := False;
  end;
end;

procedure TForm1.Button6Click(Sender: TObject);
//Post
var
  S1: String;
begin
  if InputQuery('Ввод данных для опубликования в Web', 
        'Введите публикуемые данные', S1) then
    NMHTTP1.Post(Edit1.Text, S1);
end;

procedure TForm1.Button1Click(Sender: TObject);
//Get
begin
  NMHTTP1.Get(Edit1.Text);
end;

procedure TForm1.Button2Click(Sender: TObject);
//Head
begin
  NMHTTP1.Head(Edit1.Text);
end;

procedure TForm1.Button3Click(Sender: TObject);
//Options
begin
  NMHTTP1.Options(Edit1.Text);
end;

procedure TForm1.Button7Click(Sender: TObject);
//Delete
begin
  NMHTTP1.Delete(Edit1.Text);
end;

procedure TForm1.NMHTTP1AuthenticationNeeded(Sender: TObject);
var
  AnID,
  APass:   String;
begin
  InputQuery('Требуется идентификация пользователя', 
        'Введите имя пользователя', AnID);
  InputQuery('Требуется идентификация пользователя', 
        'Введите пароль', APass);
  NMHTTP1.HeaderInfo.UserID := AnID;
  NMHTTP1.HeaderInfo.Password := APass;
  ShowMessage('Данные для регистрации введены, 
         пожалуйста, повторите предыдущую команду');
end;

procedure TForm1.NMHTTP1Failure(Cmd: CmdType);
begin
  Memo1.Text := NMHTTP1.Header;
  Memo2.Text := NMHTTP1.Body;
  case Cmd of
   CmdGET: Memo3.Lines.Add('Ошибка метода GET');
   CmdPOST: Memo3.Lines.Add('Ошибка метода Post');
   CmdHEAD: Memo3.Lines.Add('Ошибка метода HEAD');
   CmdOPTIONS: Memo3.Lines.Add('Ошибка метода OPTIONS');
   CmdTrace: Memo3.Lines.Add('Ошибка метода TRACE');
   CmdPut: Memo3.Lines.Add('Ошибка метода PUT');
   CmdDelete: Memo3.Lines.Add('Ошибка метода Delete');
   end;
end;

procedure TForm1.NMHTTP1Success(Cmd: CmdType);
begin
  if NMHTTP1.CookieIn <> '' then
     Memo4.Text := NMHTTP1.CookieIn;
     Case Cmd of
       CmdGET:
           begin
             Memo1.Text := NMHTTP1.Header;
             Memo2.Text := NMHTTP1.Body;
             Memo3.Lines.Add('Метод GET успешно выполнен');
           end;
       CmdPOST:
           begin
            Memo1.Text := NMHTTP1.Header;
            Memo2.Text := NMHTTP1.Body;
            Memo3.Lines.Add('Метод POST успешно выполнен');
           end;
       CmdHEAD:
           begin
            Memo1.Text := NMHTTP1.Header;
            Memo2.Text := NMHTTP1.Body;
            Memo3.Lines.Add('Метод HEAD успешно выполнен');
           end;
        CmdOPTIONS:
           begin
            Memo1.Text := NMHTTP1.Header;
            Memo2.Text := NMHTTP1.Body;
            Memo3.Lines.Add('Метод OPTIONS успешно выполнен');
           end;
        CmdTrace:
           begin
            Memo1.Text := NMHTTP1.Header;
            Memo2.Text := NMHTTP1.Body;
            Memo3.Lines.Add('Метод TRACE успешно выполнен');
           end;
        CmdPut:
           begin
            Memo1.Text := NMHTTP1.Header;
            Memo2.Text := NMHTTP1.Body;
            Memo3.Lines.Add('Метод PUT успешно выполнен');
           end;
        CmdDelete:
           begin
            Memo1.Text := NMHTTP1.Header;
            Memo2.Text := NMHTTP1.Body;
            Memo3.Lines.Add('Метод DELETE успешно выполнен');
           end;
        end;
end;

procedure TForm1.NMHTTP1Redirect(var Handled: Boolean);
begin
  If MessageDlg('Сервер перенаправляет вас на другой сайт. Будем переходить?', 
         mtConfirmation, [mbYes, mbNo], 0) = mrNo then
     Handled := true;
end;

end.
Текст этого приложения можно взять здесь.

    На следующем шаге мы рассмотрим компонент TNMNNTP.




Предыдущий шаг Содержание Следующий шаг