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.

Замечания

  1. Веб-сервер ничего не умеет. Его функциональность полностью зависит от вас.
  2. Сервер многопоточный, но обработчики событий выполняются в основном потоке приложения.
  3. По умолчанию используется порт 80. Через свойство Port можно назначить другой.
  4. Можно запустить несколько веб-серверов, создав несколько экземпляров THttpServer.
  5. Для обработки ошибок, возникающих в веб-сервере, подключитесь к событию OnError.
  6. Веб-сервер основан на стандартном компоненте TFPHttpServer, входящего в FreePascal и среду Lazarus. Так что всю необходимую информацию по классам можно найти в Интернете.
  7. Для программирования веб-сервера вам возможно потребуются знания html, css и javascript.
  8. Веб-сервер можно использовать не только для реализации веб-интерфейса к базе, но и для взаимодействия с какими-нибудь веб-сервисами, реализации своего веб-сервиса, взаимодействия между приложениями.

Генерация 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-адрес.

Демо-база