Використання HTTP в Delphi, Delphi, Програмування, статті

Карих Микола

Увага! Передрук даної статті або її частини без узгодження з автором. Якщо ви хочете мати цю статтю на своєму сайті або видати в друкованому вигляді, зв’яжіться з автором.

Стаття була написана для сайту: Дельфі.Вокруг та навколо.


Введення

У зв’язку з все більшою увагою, яке привертає до себе Інтернет, все більше людей стають зацікавлені в мережних технологіях. Дана стаття присвячена програмуванню на Borland Delphi з використанням одного з найбільш популярних Інтернет-протоколів – HTTP.

А саме, тут ми розглянемо компонент TNMHTTP (NetMasters HTTP), який можна виявити на вкладці FastNet палітри компонентів Дельфі.

Почнемо з теорії. Якщо Ви вже знаєте, що таке HTTP і навіщо він потрібен, то пропустите наступний розділ.

Навіщо потрібен HTTP

Отже, де ж використовується HTTP? Якщо Ви хоча б трохи заглядали на Інтернет-сторінки і зустрічалися з терміном Web, То напевно звернули увагу на те, що адреси сторінок, як правило, починаються з http://. Протокол HTTP (HyperText Transfer Protocol) Дозволяє приймати і посилати не тільки гіпертекстові документи (типу html), але і будь-які інші (тексти (txt), зображення (gif, jpg), і т.д.). Нижче наведені типові задачі, для виконання яких необхідно використовувати HTTP:

– Це лише список деяких з стандартних напрямків програмування з використанням HTTP. Ви можете застосовувати цей протокол для будь-яких своїх цілей. Наприклад, автоматичні системи оновлення даних, посилка запитів в Інтернетівські бази, і ще безліч усіляких інших можливостей!

Короткий опис властивостей, методів і подій

Нижче наведена таблиця, яка містить найбільш короткий опис основних властивостей, методів і подій компонента TNMHTTP:
















Властивості Методи Події

Body – Рядок, містить або шлях до файлу, в який буде записано тіло http-документа (якщо св-во InputFileMode одно True), Або безпосередньо саме тіло (Якщо св-во InputFileMode одно False).
Тип: string;
  Header – Рядок, містить або шлях до файлу, в який буде записаний заголовок http-документа (якщо св-во InputFileMode одно True), Або безпосередньо сам заголовок (Якщо св-во InputFileMode одно False).
Тип: string;
  HeaderInfo – Структура, містить різну інформацію про http-документі (детальніше см. в help-файлі). Тип: THeaderInfo;
  InputFileMode – Тип запису результату. Значення True – Запис у файли, вказані у властивостях Body і Header, False – Запис в самі ці властивості. Тип: Boolean;
  OutputFileMode – Тип відсилаються даних (методами Put, Post і Trace). Значення
True – Дані для відправки містяться в файлах, зазначених при виклику цих методів, а False – В самих аргументах цих методів. Тип: Boolean;


Далі деякі властивості, успадковані від TPowerSock:


BytesRecvd, BytesSent,
BytesTotal – Кількість відправлених, прийнятих і загальна кількість байтів відповідно. Тип: LongInt;
  Connected – Показує, установленно Чи в даний момент з’єднання. Тип: Boolean;
  BeenCanceled – Показує, чи було перервано сполучення з сервером. Тип: Boolean;
  Host – Рядок, що містить хост-ім’я віддаленого комп’ютера. Заповнювати не треба, так як це властивість встановлюється автоматично при виклику методів Get, Put,
Post і т.д. Тип: string. Port
Integer, Що містить порт віддаленого комп’ютера (заповнюється теж автоматично);
  TimeOut – Таймаут в мілісекундах.
Тип: Integer;

Ще є безліч властивостей, але я поки зупинюся на вже перерахованих. За додатковою інформацією звертайтеся до help-у за Дельфи.

 

Get(URL: string) – Надсилає запит на вказаний URL. Дані після виконання цього запиту записуються у файли чи в самі властивості
Body і Header (В залежності від значення властивості
InputFileMode);
  Head(URL: string) – Надсилає запит на вказаний URL. Дані після виконання цього запиту записуються у файл або в саме властивість
Header (В залежності від значення властивості InputFileMode). На відміну від методу Get, При виклику Head запит відсилається тільки на заголовок http-документа;
  Post(URL, PostData: string) – Надсилає запит на зміну http-документа (з адресою URL) на дані, що містяться в параметрі PostData. Якщо OutputFileMode дорівнює True, То в PostData повинен міститися шлях до файлу, який містить потрібні дані.
  Put(URL, PutData: string) – Надсилає запит на створення http-документа (з адресою URL), що містить дані, передані в параметрі PutData. Якщо OutputFileMode дорівнює True, То в PostData повинен міститися шлях до файлу, який містить потрібні дані.
  Trace(URL, TraceData: string) – Надсилає запит на отримання налагоджувальних даних (для налагодження з’єднання з HTTP-сервером). Дані для запиту потрібно вказати в параметрі TraceData. Якщо OutputFileMode дорівнює True, То в TraceData повинен міститися шлях до файлу, який містить потрібні дані.
  Delete(URL: string) – Надсилає запит на видалення http-документа (з адресою URL).


Далі деякі методи, успадковані від TPowerSock:


Abort і Cancel – Переривають з’єднання і обмін даними;
  Disconnect – Від’єднання від HTTP-сервера;


 

OnAuthenticationNeeded – Виникає, коли сервер вимагає зазначення імені користувача і пароля. В обробнику цього події (якщо воно виникне) Ви повинні відповісти серверу, запонів потрібними значеннями відповідні змінні. Примітка: Перед встановленням з’єднання можна відразу заповнити поля UserID і Password у властивості HeaderInfo;
  OnAboutToSend – Виникає, коли компонент TNMHTTP збирається відправляти дані (запит). В обробнику цієї події можна заповнити додатковою інформацією властивість SendHeader;
  OnFailure – Виникає, коли поточна операція завершилася невдало, тобто сталася помилка;
  OnRedirect – Виникає, сервер переадресував посилання з вказаної URL на іншу посилання. Встановивши параметр handled в значення True можна заборонити переадресацію і зупинитися на запитаної URL. Значення за замовчуванням – False;
  OnSuccess – Виникає, коли поточна операція завершилася успішно, тобто запит був виконаний без помилок;


Далі деякі методи, успадковані від TPowerSock:


OnConnect – Виникає, коли з’єднання з сервером успішно встановлено;
  OnDisconnect – Виникає, коли з’єднання з сервером завершено;
  OnConnectionFailed – Виникає, коли з’єднання з сервером встановити не вдалося;
  OnError – Виникає, коли остання операція була завершена з помилкою;
  OnHostResolved – Виникає, коли від DNS отримано IP-адреса зазначеного хоста;
  OnInvalidHost – Виникає, коли DNS повернув помилку при спробі визначити IP-адресу зазначеного хоста;
  OnPacketRecvd – Виникає, коли значення властивостей BytesRecvd і BytesTotal змінені, тобто була прийнята нова порція даних від сервера;
  OnPacketSent – Виникає, коли значення властивостей BytesSent і BytesTotal змінені, тобто була відправлена нова порція даних на сервер;
  OnStatus – Виникає, коли статус компонента був змінений (для оновлення візуального сповіщення користувача);


Практика і приклади

Ну а тепер приступимо до найголовнішого методу вивчення – на прикладах.

І найперший приклад – програма, що дозволяє визначити, чи існує заданий URL:






Приклад 1. Перевірка існування зазначеної URL


{… Тут йде заголовок файлу і визначення форми TForm1 і її примірника Form1}
{У форму потрібно помістити кнопку TButton і одне поле TEdit. При натисканні на кнопку викликається обробник події OnClick – Button1Click. Перед цим в TEdit потрібно ввести адресу URL.
НЕ ЗАБУДЬТЕ помістити у форму КОМПОНЕНТ TNMHTTP!}
procedure Button1Click(Sender: TObject);
begin
  {Питаемя отримати заголовок}
  NMHTTP1.Head(Edit1.Text);
  {Якщо URL невірний, то тут вискочить помилка}
end;

Далі – скачування зазначеної сторінки в зазначений файл.






Приклад 2. Скачування зазначеної URL в заданий файл


{… Тут йде заголовок файлу і визначення форми TForm1 і її примірника Form1}
{У форму потрібно помістити кнопку TButton і три поля TEdit. При натисканні на кнопку викликається обробник події OnClick – Button1Click. Перед цим в перший TEdit потрібно ввести адресу URL, в другій – ім’я файлу для заголовка, а в третій – ім’я файлу для тіла сторінки (html).
НЕ ЗАБУДЬТЕ помістити у форму КОМПОНЕНТ TNMHTTP!}
procedure Button1Click(Sender: TObject);
begin
  {Намагаємося отримати http-документ}
  {Результат треба записати у файли}
  NMHTTP1.InputFileMode := True;
  {А тут вказуємо в які саме файли}
  NMHTTP1.Header := Edit2.Text;
  NMHTTP1.Body := Edit3.Text;
  NMHTTP1.Get(Edit1.Text);
end;

Наступний приклад – скачування відразу декількох URL одночасно. Треба зауважити, що багато програмісти нехтують багатозадачністю Windows (неважливо, як вона реалізована, мова зараз не про це). У Дельфі дуже легко створювати окремі, підлеглі Вашій програмі процеси (а точніше – потоки) за допомогою базового класу
TThread. Але про це ми поговоримо іншим разом (в іншій статті).






Приклад 3. Одночасне скачування зазначених URL в заданий каталог


{… Тут йде заголовок файлу і визначення форми TForm1 і її примірника Form1}
{Опис класу окремого процесу}
type
  THTTPThread = class(TThread)
  private
     {Для кожного процесу – створюємо свій компонент TNMHTTP}
    FHTTP: TNMHTTP;
  protected
{Execute викликається при запуску процесу; override – замінюємо існуючу процедуру базового класу TThread}
    procedure Execute; override;
{DoWork – створена нами функція, виконання якої синхронізується в
Execute}
    procedure DoWork;
  public
{URL – створена нами рядок, що вказує процесу, який URL йому потрібно скачати}
    URL: string;
  end;
{У форму потрібно помістити три кнопки TButton, одне поле TEdit і один список TListBox. При натисканні на кнопку Button1 викликається обробник події OnClick – Button1Click. Перед цим в TEdit потрібно ввести шлях до каталогу, в якому будуть зберігатися завантажені файли, а ListBox1 потрібно заповнити списком URL-ів для скачування (за допомогою кнопок Add (Button2) і Delete (Button3)).}
procedure TForm1.Button3Click(Sender: TObject);
begin
  {Видалення виділеного URL зі списку}
  if ListBox1.ItemIndex >= 0 then
    ListBox1.Items.Delete(ListBox1.ItemIndex);
end;
procedure TForm1.Button2Click(Sender: TObject);
  var s: string;
begin
  {Додавання URL в список}
s: = InputBox (‘Додати’, ‘Введіть URL:’,”);
  if s <> ” then
    ListBox1.Items.Add(s);
end;
procedure TForm1.Button1Click(Sender: TObject);
  var i: Integer;
begin
  {Перевірка на існування каталога}
  if Length(Edit1.Text) > 0 then
    if not DirectoryExists(Edit1.Text) then
      MkDir(Edit1.Text);
  {Далі йде створення для кожного URL в списку свого процесу}
  for i := 0 to ListBox1.Items.Count-1 do begin
    with THTTPThread.Create(True) do begin
      {Створюємо призупинену завдання, вказуємо їй її URL і запускаємо її}
      URL := ListBox1.Items[i];
      Resume;
    end;
  end;
end;
  {Оператори процесу THTTPThread}
procedure THTTPThread.Execute;
begin
  {Робимо так, щоб кожен процес виконувався одночасно з іншими (синхронізація)}
  Synchronize(DoWork);
end;
procedure THTTPThread.DoWork;
  var i: Integer;
begin
  {Створюємо компонент TNMHTTP}
  FHTTP := TNMHTTP.Create(Form1);
  {Результат треба записувати у файли}
  FHTTP.InputFileMode := True;
  {Підбираємо імена для файлів}
  i := 1;
  while FileExists(Form1.Edit1.Text+’\page’+IntToStr(i)+’.htm’) do
    Inc(i);
  {Вказуємо, в які саме файли класти результат}
  FHTTP.Body := Form1.Edit1.Text+’\body’+IntToStr(i)+’.htm’;
  FHTTP.Header := Form1.Edit1.Text+’\header’+IntToStr(i)+’.txt’;
  {Намагаємося послати запит}
  FHTTP.Get(URL);
  {Перед завершенням процесу не забуваємо звільнити пам’ять з-під компонента}
  FHTTP.Free;
end;

ПРИМІТКА: Щоб завершити деякий процес (Thread), потрібно викликати метод Terminate класу цього процесу. Призупинити процес можна оператором Suspend, А продовжити виконання – Resume. Також можна налаштувати пріоритет кожного окремого процесу через властивість
Priority.

Непоганий приклад роботи з процесами можна знайти в папці Demos\Threads папки, куди Ви встановили Delphi.

Зауваження за алгоритмами типових завдань

Якщо Ви збираєтеся створити скачівалку сайтів, то Вам необхідно враховувати наступне (вирішити наступні проблеми):

Епілог

У цій статті відображені основні прийоми роботи з компонентом TNMHTTP в Дельфи. Якщо у Вас є питання – скидайте їх мені на E-mail:
snick@mailru.com, А ще краще – пишіть в конференції цього сайту (Delphi. Загальні питання), щоб і інші користувачі змогли побачити Ваше питання і спробувати на нього відповісти!

Зауважу, що TNMHTTP – не єдиний компонент, реліз доступ по протоколу HTTP. Є і його аналоги з більш розширеними можливостями, наприклад, набір компонентів ICS (Internet Component Suite), до складу якого входить навіть компонент FTPServer, що дозволяє легко запрограмувати свій власний сервер FTP для Windows. Цей набір можна завантажити на сайті
Delphi Super Page.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*