Серверне програмування в Delphi (документація)

Переглядаючи вміст якого-небудь сайту, ти завантажуєш в свій комп'ютер статичні і динамічні HTML-сторінки. Якщо з першими все зрозуміло, то з останніми справа йде трохи інакше. Динамічні веб-сервера можуть бути побудовані на різних технологіях: CGI (Perl, C / C + +), PHP, ISAPI, ASP. Зараз найпоширеніші – це CGI і PHP (хоча PHP-скрипти можуть працювати і через CGI-інтерфейс). І так уже склалося, що CGI асоціюється саме з перлом, адже на цьому мовою написано безліч супернавороченних скриптів. Але насправді це може бути практично будь-яку мову, в тому числі C / C + + і навіть Delphi. Про останній якраз і піде розмова в нашій статті.

Протоколи програмування

CGI (Common Gateway Interface) – це стандартний протокол зв'язку між браузером і веб-сервером. Замість CGI можна скористатися абсолютно іншим підходом (шляхом звернення до інтерфейсів API сервера), таким як ISAPI (Internet Server API), розробленим Microsoft, і NSAPI (Netscape Server API). ISAPI дозволяє писати DLL, що завантажуються в адресний простір сервера і зберігаються там якийсь час. Завантаживши DLL, сервер отримує можливість використовувати для обробки кожного запиту окремий потік. Тобто сервер отримує запит, вантажить DLL (якщо вона ще не завантажена) і виконує відповідний код, результат якого і надсилається клієнту. А так як службовий обмін даними на сервері здійснюється через пам'ять, такі програми працюють на порядок швидше, ніж аналогічні CGI. Apache сервер теж дозволяє розширити свої можливості за допомогою CGI, але він підтримує спеціальні бібліотеки розширення (модулі).

Як це в Delphi

Існує безліч мов програмування, що підтримують розробку серверних додатків. І зовсім не обов'язково вивчати нову мову тільки через те, що, на думку деяких, він має перевагу перед тим, до якого ти вже звик, і на якому писати код тобі значно простіше. Так що, якщо ти віддав перевагу іншим мовам програмування саме Delphi, цей матеріал для тебе. Я не дарма перерахував всі види серверного програмування – усі вони підтримуються Delphi, і їх розробка в його середовищі приємна і нескладна. Давай розглянемо докладніше. Звичайно, розробляти CGI та інші типи серверних додатків в Дельфи можна по-різному, але я пропоную використовувати технологію WebBroker, підтримуючу ієрархію класів VCL і CLX, що сильно спрощує розробку веб-додатків, а також спеціальний тип модулів даних (WebModule). Найголовніше, що компонент WebModule є загальним для всіх типів додатків! Тобто ніяких змін в коді, будь то ISAPI-, або CGI-проект, ти не знайдеш! Єдине АЛЕ: якщо розробляєш проекти ISAPI, то код в різних версіях Дельфі буде відрізнятися, а якщо вирішив писати модулі Apache, то їх доведеться встановити на сервер. Для цього помісти свій модуль в папку modules сервера і відредагую файл httpd.conf – читай коментарі всередині файлу. А тепер давай напишемо простеньке веб-додаток.

Графічний лічильник звернень

Чому я вибрав такий простий приклад? Мета моєї статті – показати можливості Delphi, а далі вже на твій розсуд. Отже, запускай Delphi і лізь у New -> Other -> Web Server Application. Далі з'явиться діалогове вікно, в якому ти зможеш вибрати тип програми (вибирай CGI). Перед тобою з'явилося віконце компонента WebModule1. Для побудови програми тобі доведеться редагувати Actions цього компонента. Додай новий Action, натиснувши на кнопку Add new в діалоговому вікні Editing Webmodule1.Actions. Після цього створи обробник події OnAction і напиши туди код. Поясню, ми створюємо не багатофункціональне додаток, а простий лічильник відвідуваності, тому ніякі інші властивості компонента редагувати не треба, а от для більш складних додатків знадобиться редагування поля PathInfo для кожного нового Action'а. Думаю, ти розумієш, навіщо це потрібно. А тепер давай розберемося з програмою. Тільки спочатку відредагую розділ uses:
uses Windows, Graphics, Jpeg, ExtCtrls, SysUtils, Classes, HTTPApp;
Сам код писати не буду – там все дуже просто. Розповім лише, як це працює. Існує два методи написання графічних лічильників: перший полягає у малюванні картинок з цифрами від 0 до 9 і подальшої комбінації з них потрібного числа. Другий (ми будемо використовувати його) – малювання в пам'яті растрової картинки з висновком числа прямо на ній. Як ми цього доб'ємося? Для початку створюємо растрове зображення (Компонент Image), а для малювання на ньому використовуємо стандартні методи класу TCanvas. Далі ми підключаємо це зображення до об'єкта класу TJpegImage, щоб отримати зображення у форматі jpeg. Після цього можна зберегти отримані дані в потік і повернути їх клієнтові. Механізм же реалізації лічильника ще простіше: при зверненні клієнта до програми здійснюється перевірка на наявність лог-файлу з числом відвідувань. Якщо файл існує, то програма просто додає одиницю і перезаписує файл, якщо ж його немає, то в файл пишеться одиниця (так як ми все-таки звернулися до сторінки один раз). А далі здійснюється підготовка зображення і відправлення його клієнту. За пересилання зображення клієнту відповідають три вирази:
Response.ContentType: = 'image / jpeg'; – задає тип вмісту відповіді;
Response.ContentStream: = Stream; – присвоює потік властивості ContentStream;
Response.SendResponse; – відправляє відповідь клієнту.
Тепер для перевірки працездатності програми ти можеш звернутися до нього так: www.somehost.ru/cgi-bin/Project1, або вставити в потрібну тобі сторінку тег <img src="путь_к_скріпту">.

Висновок

І останнє. При написанні серверних додатків кожен стикався з проблемою їх налагодження. Але у тих, хто використовує Delphi таких проблем більше не буде: починаючи з 6 версії з'явився вбудований відладчик Web App Debugger. Тепер у тебе є початкові знання, необхідні для написання серверного додатки на Delphi.

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


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

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

Ваш отзыв

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

*

*