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"
}
]
- Postman - это мощный набор инструментов тестирования API
- SOAPUI - приложение для тестирования, мониторинга и проверки функциональности REST API.
«API json DB» имеет свой RESTfull API роутинг для cURL запросов который написан на PHP с использованием Micro Framework Slim, что позволяет использовать «API json DB» с любым другим языком программирования. Для унификации обмена данными и структуры базы данных используется наш собственный стандарт APIS-2018.
- В файле 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/
.
boolean
— Логический типtrue
илиfalse
integer
— Целое числоdouble
— Число с плавающей точкойstring
— Строка
Структура базы данных db.json выведена в отдельный репозиторий
https://example.com/{api_dir}/{table_name}/{id}
{api_dir}
- папка в которой лежит index.php{resource}
- название ресурса к которому обращаемся. Например price или user.{id}
- уникальный индефикатор{param}
- праметры запроса
?offset={offset}&limit={limit}&order={order}&sort={sort}&public_key={public_key}
{public_key}
- Ключ доступа к RESTful API{limit}
- Записей на страницу. По умолчанию 10{offset}
- Страница. По умолчанию 0{order}
- Тип сортировки. По умолчанию asc{sort}
- Поле сортировки. По умолчанию id{*}
- Любое из полей таблицы
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 /_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}
Удалить конкретную запись
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"]);
}
}
}
}
HTTP/1.1 200 OK
Content-Type: application/json
Советы по увеличению безопасности API json 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();
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.