pllano / json-db
API json DB
Requires
- php: >=5.4.0
Requires (Dev)
- defuse/php-encryption: ^v2.1
- guzzlehttp/guzzle: ^6.3
- monolog/monolog: ^1.23
- phpunit/phpunit: ^6.4
- slim/slim: ^3.9
README
JSON база данных с открытым исходным кодом. Написана на PHP. Распространяется по лицензии MIT. Подключается через Composer как обычный пакет PHP, после подключения сама настраивается за несколько секунд. Имеет свой RESTful API интерфейс работающий по стандарту обмена информацией сервер-сервер «APIS-2018», что позволяет использовать ее с любым другим языком программирования. «API json DB» это продвинутый менеджер json файлов с возможностью кеширования популярных запросов, шифрования файлов db, проверкой валидности файлов и очередью на запись при блокировке таблиц (файлов db) на запись другими процессами. Основанием для «API json DB» мы выбрали прекрасную работу Greg0/Lazer-Database. Мы полностью изменили структуру оригинала и добавили: шифрование, API роутинг, кеширование, проверку валидности, очередь на запись и другой удобный функционал.
Старт за несколько минут
Подключить с помощью Composer
"require": { "pllano/json-db": "^1.0.5" }
Подключить с помощью AutoRequire
"require" [ { "namespace": "jsonDB", "dir": "/ruslan-avantis/json-db/src", "link": "https://github.com/ruslan-avantis/json-db/archive/master.zip", "name": "json-db", "version": "master", "vendor": "pllano" } ]
Инструменты для тестирования API
- Postman - это мощный набор инструментов тестирования API
- SOAPUI - приложение для тестирования, мониторинга и проверки функциональности REST API.
Инструменты для работы с API
RESTful API роутинг для cURL запросов
«API json DB» имеет свой RESTfull API роутинг для cURL запросов который написан на PHP с использованием Micro Framework Slim, что позволяет использовать «API json DB» с любым другим языком программирования. Для унификации обмена данными и структуры базы данных используется наш собственный стандарт APIS-2018.
RESTfull API состоит всего из двух файлов:
Для установки RESTful API
выполните следующие действия:
- В файле index.php укажите директорию где хранится база, например
/www/_db_/
или__DIR__ . '/../../_db_/'
. - Перенесите файлы index.php и .htaccess в директорию доступную через URL. Например:
https://example.com/_12345_/
- Запустите API перейдя по ссылке
https://example.com/_12345_/
- Если база работает Вы увидите следующий результат:
{ "headers": { "status": "200 OK", "code": 200, "message": "RESTfull API json DB works!", "message_id": "https:\/\/github.com\/pllano\/APIS-2018\/tree\/master\/http-codes\/200.md" } }
Автоматическое разворачиваение
При запуске база создаст в папке _db_
которую вы указали:
- Таблицу своей конфигурации
db.data.json
иdb.config.json
- Таблицу для кеша
cached.data.json
иcached.config.json
- Таблицу для очереди запросов
queue.data.json
иqueue.config.json
- Директории:
cached
core
log
- В директории
core
сгенерирует файл с ключем для http запросов key_db.txt если его там еще нет. - В директорию
core
скачает этот db.json файл структуры если его там еще нет.
Автоматическое создание ресурсов
База автоматически создаст все ресурсы и связи указанные в файле db.json. Для создания индивидуальной конфигурации ресурсов отредактируйте файл db.json и перед запуском скопируйте его в директорию /_db_/core/
.
Поддерживаемые типы данных в db.json
boolean
— Логический типtrue
илиfalse
integer
— Целое числоdouble
— Число с плавающей точкойstring
— Строка
Структура базы данных для интернет-магазина
Структура базы данных db.json выведена в отдельный репозиторий
URL запросов к RESTful API jsonDB
https://example.com/{api_dir}/{table_name}/{id}
{api_dir}
- папка в которой лежит index.php{resource}
- название ресурса к которому обращаемся. Например price или user.{id}
- уникальный индефикатор{param}
- праметры запроса
GET запрос к RESTful API jsonDB
?offset={offset}&limit={limit}&order={order}&sort={sort}&public_key={public_key}
{public_key}
- Ключ доступа к RESTful API{limit}
- Записей на страницу. По умолчанию 10{offset}
- Страница. По умолчанию 0{order}
- Тип сортировки. По умолчанию asc{sort}
- Поле сортировки. По умолчанию id{*}
- Любое из полей таблицы
RESTful API jsonDB потдерживает POST
GET
PUT
PATCH
DELETE
запросы:
POST /{resource}
Создание записиPOST /{resource}/{id}
ОшибкаGET /{resource}
Список всех записейGET /{resource}?{param}
Список всех записей с фильтром по параметрамGET /{resource}/{id}
Данные конкретной записиPUT /{resource}
Обновить данные записейPUT /{resource}/{id}
Обновить данные конкретной записиPATCH /{resource}
Обновить данные записейPATCH /{resource}/{id}
Обновить данные конкретной записиDELETE /{resource}
Удалить все записиDELETE /{resource}/{id}
Удалить конкретную запись
При желании Вы можете использовать только GET
запросы:
GET /_post/{resource}?{param}
Создание записиGET /_post/{resource}/{id}
ОшибкаGET /_get/{resource}?{param}
Список всех записей с фильтром по параметрамGET /_get/{resource}/{id}
Данные конкретной записиGET /_put/{resource}?{param}
Обновить данные записейGET /_put/{resource}/{id}?{param}
Обновить данные конкретной записиGET /_patch/{resource}?{param}
Обновить данные записейGET /_patch/{resource}/{id}?{param}
Обновить данные конкретной записиGET /_delete/{resource}
Удалить все записиGET /_delete/{resource}/{id}
Удалить конкретную запись
Пример использования с HTTP клиентом Guzzle
use GuzzleHttp\Client as Guzzle; $public_key = $config['settings']['db']['public_key']; // Взять key из конфигурации `https://example.com/_12345_/index.php` $resource = 'db'; $id = '1'; // $uri = 'https://example.com/_12345_/'.$resource.'?public_key='.$public_key; $uri = 'https://example.com/_12345_/'.$resource.'/'.$id.'?public_key='.$public_key; $client = new Guzzle(); $resp = $client->request('GET', $uri); $get_body = $resp->getBody(); // Чистим все что не нужно, иначе json_decode не сможет конвертировать json в массив for ($i = 0; $i <= 31; ++$i) {$get_body = str_replace(chr($i), "", $get_body);} $get_body = str_replace(chr(127), "", $get_body); if (0 === strpos(bin2hex($get_body), 'efbbbf')) {$get_body = substr($get_body, 3);} $response = json_decode($get_body, true); if (isset($response["headers"]["code"])) { if ($response["headers"]["code"] == 200) { $count = count($response["body"]["items"]); if ($count >= 1) { foreach($response["body"]["items"] as $item) { // Если $value object переводим в array $item = is_array($value["item"]) ? $item["item"] : (array)$value["item"]; // Получаем данные print_r($item["name"]); } } } }
RESTful API jsonDB - Всегда возвращает код 200 даже при логических ошибках !
HTTP/1.1 200 OK
Content-Type: application/json
В теле ответа RESTful API jsonDB вернет код состояния HTTP, статус и описание.
Безопасность
Советы по увеличению безопасности API json DB
Прямое подключение к DB
Если вам не нужен API роутинг Вы можете работать с базой данных напрямую без REST API интерфейса - Документация - работа с DB напрямую или если вам не нужны (кеширование, шифрование) использовать оригинальный пакет Lazer-Database.
Запуск одной строчкой кода
(new \jsonDB\Db(__DIR__ . '/../../_db_/'))->run(); // Или так $_db = __DIR__ . '/../../_db_/'; $db = new Db($_db); $db->run();
Запуск с параметрами
use jsonDB\Db; $_db = __DIR__ . '/../../_db_/'; // Указываем директорию где будет храниться json db $db = new Db($_db); $db->setPrefixTable("sf"); // Установить префикс таблиц $db->setPrefixColumn("jhbg5r"); // Установить префикс полей $db->setCached(false); // Включаем кеширование true|false $db->setCacheLifetime(60); // Время жизни кеша 60 минут $db->setTemp(false); // Используем очередь true|false $db->setApi(false); // Если работаем как основная база устанавливаем false $db->setStructure(""); // URL к файлу структуры db.json (Не обезательно) $db->setPublicKey(""); // Установить public_key (Не обезательно) $db->setCrypt(false); // Шифруем таблицы true|false $db->setCryptKey(file_get_contents($_db . 'core/key_db.txt', true)); // Загружаем ключ шифрования $db->run();
Примечание: Если вы будете пользоваться RESTful API роутингом для cURL запросов, вам не нужно выполнять запуск базы, роутер index.php сделает все сам. Вам достаточно установить пакет с помощью Composer и выпонить дейсвия с настройкой API роутинга описаны выше.
Создать ресурс в базе данных
use jsonDB\Database as jsonDb; $arr = array( 'id' => 'integer', 'name' => 'string', 'название_поля' => 'тип данных' ); jsonDb::create('resource_name', $arr);
Удалить ресурс в базе данных
use jsonDB\Database as jsonDb; jsonDb::remove('resource_name');
Очистить ресурс
use jsonDB\Database as jsonDb; jsonDb::table('resource_name')->delete();
Проверьте, существует ли ресурс в базе данных
use jsonDB\Validate; use jsonDB\dbException; try{ Validate::table('resource_name')->exists(); } catch(dbException $e){ // Ресурс не существует }
Создать запись
use jsonDB\Database as jsonDb; $row = jsonDb::table('resource_name'); $row->name = 'Ivan'; $row->save();
Примечание: Если тип поля integer
а вы передаете число в кавычках, будет ошибка: неверный тип данных
.
Для того чтобы избежать ошибки, добавляйте проверку и передавайте число без кавычек как в примере ниже.
use jsonDB\Database as jsonDb; $row = jsonDb::table('resource_name'); $row->num = $num; $row->save();
Получить данные
use jsonDB\Database as jsonDb; echo jsonDb::table('resource_name')->where('name', '=', 'Ivan')->findAll(); // или по id echo jsonDb::table('resource_name')->where('id', '=', '10')->findAll();
Обновить данные
use jsonDB\Database as jsonDb; $row = jsonDb::table('resource_name')->find(10); $row->name = 'Andrey'; $row->save();
Удалить запись по id
use jsonDB\Database as jsonDb; jsonDb::table('resource_name')->find(10)->delete();
Поддержка, обратная связь, новости
Общайтесь с нами через почту open.source@pllano.com
Если вы нашли баг в API json DB загляните в issues, возможно, про него мы уже знаем и постараемся исправить в ближайшем будущем. Если нет, лучше всего сообщить о нём там. Там же вы можете оставлять свои пожелания и предложения.
За новостями вы можете следить по коммитам в этом репозитории. RSS.
Лицензия
The MIT License (MIT). Please see LICENSE for more information.