Skip to content
This repository has been archived by the owner on Oct 3, 2024. It is now read-only.

Скрипт:webui

WirelessWizard edited this page Oct 2, 2012 · 5 revisions

http сервер реализован в src/web/server.lua

Table of Contents

HTTP REST API

В каталоге /api/ сервера находятся ресурсы, к которым можно получить доступ с помощью HTTP REST API.

Сводка

Ниже $id — id запрашиваемого объекта.

формат ячейки:

метод внутри сервера http код состояния
Методы
Путь внутри /api/ HEAD GET POST LINK UNLINK CREATE DELETE
/object/ search 200 search 200 405 405 405 405 405
/object/$id/ read 200,404 read 200,404 update 200,404,500 connect 200,404,500 disconnect 200,404,500 405 remove 204,404,500
/person/ search 200 search 200 405 405 405 create 201,500 405
/person/$id/ read 200,404 read 200,404 update 200,404,500 connect 200,404,500 disconnect 200,404,500 405 remove 204,404,500
/group/ search 200 search 200 405 405 405 create 201,500 405
/group/$id/ read 200,404 read 200,404 update 200,404,500 connect 200,404,500 disconnect 200,404,500 405 remove 204,404,500
/event/ search 200 search 200 405 405 405 create 201,500 405
/event/$id/ read 200,404 read 200,404 update 200,404,500 connect 200,404,500 disconnect 200,404,500 405 remove 204,404,500

Метод HEAD эквивалентен методу GET, но ответ сервера не содержит данных.

Ответы сервера

Сервер присылает ответ в виде json представления объектов. Любой объект обязательно имеет поля "id" и "type", при вызове метода "search" возвращается массив таких объектов (возможно пустой).

В случае ошибки возвращается объект json, содержащий единственное поле "error" с текстовым описанием ошибки.

Примеры корректных диалогов

Запрос всех объектов

    200 OK
    Content-Type: application/json
    Content-Length: ...<здесь длина данных>...
    
    [
    {
        "type": "person",
        "id": "0",
        "name": "Вася",
        "surname": "Пупкин",
        "sex": "MALE",
        "groups": [
            "1"
        ]
    },
    {
        "type": "group",
        "id": "1",
        "name": "Пупкины"
    }
    ]
    

Запрос одного объекта типа person

    200 OK
    Content-Type: application/json
    Content-Length: ...<здесь длина данных>...
    
    {
        "type": "person",
        "id": "0",
        "name": "Вася",
        "surname": "Пупкин",
        "sex": "MALE",
        "groups": [
            "1"
        ]
    }
    
    Далее для краткости приведены только подробности запросов.

Поиск

Поиск по всем полям всех объектов:

    GET /api/object/?q=Пупкин HTTP/1.1

Поиск по конкретному полю объектов групп:

    GET /api/group/?name=Пупкины HTTP/1.1

Обновление значения поля

Заголовок запроса:

    name=name&value=Vasya

Связь двух объектов

Связать два объекта:

    LINK /api/person/0 HTTP/1.1
    Location: /api/group/1

Разорвать связь:

    UNLINK /api/person/0 HTTP/1.1
    Location: /api/group/1

Создание объекта

    201 Created
    Content-Type: application/json
    Content-Length: ....
    Location: /api/event/2
    
    {
        "type": "event",
        "id": "2"
    }

Удаление объекта

    204 No content

Выключение программы

Штатное завершение работы.

    shutdown=1
    
    200 OK
    
    { "state": "shutting down" }

Синхронизация

Сервер запоминает изменения, производимые в объектах. получить все изменения начиная с определенного состояния можно с помощью GET запроса по адресу /api/log/<номер состояния>

Запуск сервера

Установка luasocket

Внимание, для корректной работы webUI должен быть установлен пакет luarocks, а также luarock luasocket, который можно установить следующим образом:

    luarocks [--local] install luasocket

Используйте опцию --local, чтобы установить пакет внутри домашней директории.

Конфигурация

В файле $HOME/.unisched/rc.lua следует указать следующие настройки:

Параметр Значение Комментарий
local build /path/to/build Путь к директории сборки.
local src /path/to/src Путь к директории с проектом.
config.ui 'luaui' Используется LuaUI.
config.storage 'SQLITE SQLite для хранения данных.
config.modules_path build .. '/src/modules/storage:' .. build .. '/src/modules/ui' Пути к модулям.
config.sqlite_db /path/to/sqlite/database Путь к файлу базы данных.
config.httpd {} Содержит в себе несколько параметров, задающих поведение сервера.
config.httpd.host '0.0.0.0' На каком адресе ждать обращений.
config.httpd.port 8000 Порт, на котором ждать обращений.
config.httpd.api_prefix '/api/' Не меняйте, ни в коем случае - виртуальная директория, обращения к которой сервер перехватывает и обрабатывает как запросы к API
config.httpd.static_dir src .. '/src/web/static/' Корневая директория сервера, в ней находятся все скрипты, стили и прочие ресурсы.
config.script src .. '/src/web/server.lua' LuaUI должен использовать скрипт с реализацией сервера.

Пример конфигурационного файла:

    config.ui = 'luaui'
    -- Possible variants: 'DummyUI', 'CLI', luaui'
    
    config.storage = 'SQLITE'
    -- Possible variants: SQLITE
    
    local home = os.getenv('HOME')   -- $HOME directory
    local src = home .. '/code/UniSched' -- repo directory
    local build = home .. '/code/build' -- build directory
    
    config.modules_path = build .. '/src/modules/storage:' .. build .. '/src/modules/ui'
    -- Path to modules
    
    config.sqlite_db = home .. '/.unisched/unisched.db'
    -- Path to sqlite3 database.
    
    config.httpd = {  -- web ui settings
        host = '0.0.0.0',  
        port = 8000,
        api_prefix = '/api/', -- prefix before api path (must be '/api/')
        static_dir = src .. '/src/web/static/' -- server '/' directory
    }
    
    config.script = src .. '/src/web/server.lua'
    

Данный конфигурационный файл предполагает, что директория с репозиторием находится в $HOME/code/UniSched, а директория сборки в $HOME/code/build. Также предполагается, что база данных находится в $HOME/.unisched/unisched.db

Чтобы запустить, переходим в папку, где собирали расписатор и запускаем

    ./src/raspisator

Запущенный сервер будет ожидать подключений по адресу: http://localhost:8000/

Clone this wiki locally