На этом шаге мы рассмотрим пример использования компонента 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.