26. Встроенный веб-сервер
В любом приложении DataExpress может быть запущен встроенный веб-сервер, который позволяет управлять вашей базой данных с любого устройства, имеющего браузер. Сервер представлен классом THttpServer. Для запуска веб-сервера создайте новый экземпляр класса и вызовите метод Start. Сервер работает в отдельном потоке, но для обработки входящих запросов передает управление основному потоку приложения, поэтому длительная обработка запросов будет «подвешивать» приложение. Для обработки входящих запросов необходимо подключиться к событию OnRequest. Небольшой пример:
var Server: THttpServer; procedure HandleRequest(Sender: TObject; var ARequest: TFPHttpConnectionRequest; var AResponse: TFPHttpConnectionResponse); begin if ARequest.Query = 'neworder' then begin AResponse.Content := '<html>' + ... + '</html>'; end; end; procedure Database_Open; begin Server := THttpServer.Create; Server.OnRequest := @HandleRequest; Server.Start; end; procedure Database_Close; begin Server.Free; end;
Вся информация о входящем запросе находится в параметре ARequest, ответ сервера должен передаваться в параметр AResponse.
Замечания
- Веб-сервер ничего не умеет. Его функциональность полностью зависит от вас.
- Сервер многопоточный, но обработчики событий выполняются в основном потоке приложения.
- По умолчанию используется порт 80. Через свойство Port можно назначить другой.
- Можно запустить несколько веб-серверов, создав несколько экземпляров THttpServer.
- Для обработки ошибок, возникающих в веб-сервере, подключитесь к событию OnError.
- Веб-сервер основан на стандартном компоненте TFPHttpServer, входящего в FreePascal и среду Lazarus. Так что всю необходимую информацию по классам можно найти в Интернете.
- Для программирования веб-сервера вам возможно потребуются знания html, css и javascript.
- Веб-сервер можно использовать не только для реализации веб-интерфейса к базе, но и для взаимодействия с какими-нибудь веб-сервисами, реализации своего веб-сервиса, взаимодействия между приложениями.
Генерация html-контента на основе шаблонов
В DataExpress API добавлен класс TTemplate для генерации html-контента (и не только) на основе шаблонов. Этот класс поможет вам генерировать html-контент, возвращаемый веб-сервером. Шаблон представляет собой простой текстовый файл со специальными тегами, вместо которых будут подставлены значения. Пример:
<form id="myform" name="myform" enctype=multipart/form-data method="post" action="{+ACTION+}"> <table> <tr> <td>Устройство</td> <td> <select name="device" onchange="fillModels()"> <option value="0">Выберите устройство</option> {+DEVICES+} </select> </td> </tr> <tr> <td>Марка</td> <td> <select name="brand" onchange="fillModels()"> <option value="0">Выберите марку</option> {+BRANDS+} </select> </td> </tr> <tr> <td>Модель</td> <td> <select name="model"> <option value="0">Выберите модель</option> {+MODELS+} </select> </td> </tr> <tr> <td>Серийный номер</td> <td> <input name="serial" type="text" value="{+SERIAL+}"> </td> </tr> <tr> <td>Дата выпуска</td> <td> <input name="date" type="text" value="{+DATE+}"> </td> </tr> ...
Специальные теги заключаются в скобки {+ … +}, которые можно поменять, задав свойства StartDelimiter и EndDelimiter. Теги могут иметь параметры, которые заключаются в скобки [- … -]. Пример:
<table class="beautify1"><tr class="beautify2"><td class="beautify3"> {+REPORTRESULT [-HEADER= <table bordercolorlight="#6699CC" bordercolordark="#E1E1E1" class="Label"> <tr class="Label" align=center bgcolor="#6699CC"> <th><font color="white">~Column1</font></th> <th><font color="white">~Column2</font></th> </tr> -] [- ONEROW = <tr bgcolor="#F2F2F2" class="Label3" align="center"> <td>~Column1Value</td><td>~Column2value</td> </tr> -] . .snip, and so on more parameters if needed . [- NOTFOUND= <tr class="Error"><td>There are no entries found.</td></tr> -] [-FOOTER=</table>-] +} </table>
Простые теги и теги с параметрами обрабатываются в событии OnReplaceTag. Для простых тегов более удобным вариантом может быть использование свойства Tags. Через это свойство определяются значения тегов, которые будут подставлены в шаблон. Пример:
Tpl := TTemplate.Create; Tpl.Tags['device'] := 1; Tpl.Tags['serial'] := 'ABCDEFG'; Tpl.FileName := '....'; // Указываем файл шаблона ... Tpl.Template := 'текст шаблона'; // ... или содержимое шаблона Result := Tpl.GetContent; // Получаем готовый контент.
Демо-база
Небольшой пример использования веб-сервера. Веб-сервер умеет отображать список устройств, добавлять, редактировать, удалять устройства, загружать фотографии, взаимодействует с javascript для подгрузки списка моделей в карточку устройства (AJAX). Клиентская часть (html, css, javascript) была подготовлена в NetBeans IDE.
Откройте базу, в браузере в адресной строке наберите: http://127.0.0.1 или localhost. Также на любом устройстве локальной сети в адресной строке браузера наберите IP-адрес сервера. Чтобы получить доступ к веб-серверу через интернет, надо настроить проброс портов в роутере или получить у провайдера статический ip-адрес.