Как превратить базу данных в RESTful API

Рассказываем об инструменте, который позволяет настроить API для работы с запросами PostgreSQL. Говорим о возможностях, критике и альтернативах решения.

Что такое PostgREST

Это — веб-сервер с открытым исходным кодом для работы с базой данных PostgreSQL по API. По словам авторов, решение представляет собой альтернативу ручному CRUD-программированию. С его помощью не нужно писать бизнес-логику, усложняющую структуру БД, и работать с ORM mapping, который приводит к появлению медленного императивного кода.

PostgREST написан на Haskell, распространяется по свободной лицензии и имеет обширное сообщество — поддержку по продукту можно получить в gitter-чате. Сегодня веб-сервер активно используют в продакшн такие проекты, как аналитический инструмент от Oracle — Moat, e-commerce платформа iAdvize и система для формирования графиков по URL Image-charts. Также для PostgREST разработаны расширения под OAuth, websocket и nginx.

Немного о возможностях

Система способна обрабатывать запросы ко всем представлениям и таблицам схемы БД. Например, вот команда для получения данных из таблицы people:

GET /people HTTP/1.1

Помимо GET, среди ключевых слов можно выделить: OPTIONS, POST, PATCH и DELETE. Все они учитывают права доступа при работе с данными. Запрос к таблице, для обращения к которой у пользователя недостаточно полномочий, будет отклонен. В официальной документации есть соответствующий пример. БД получает API-запрос на добавление новой задачи в таблицу todo:

curl http://localhost:3000/todos -X POST \

-H "Content-Type: application/json" \

-d '{"task": "do bad thing"}'

В ответ PostgREST генерирует отказ:

{

"hint": null,

"details": null,

"code": "42501",

"message": "permission denied for relation todos"

}

Веб-сервер также поддерживает хранимые процедуры на PL/pgSQL, PL/Python или PLV8. Готовые процедуры можно вызывать с помощью POST /rpc/procedure_name (при передаче именованных параметров) или GET /rpc/procedure_name (при работе с GET-параметрами).

Что об инструменте думает сообщество

Генеральный директор компании, которая разрабатывает программное обеспечение для туристических агентств, говорит, что система PostgREST легковесна и нетребовательна к ресурсам. По его словам, при работе с шестью инстансами расход памяти редко превышает 70 Мбайт, в то время как для связки Node.js/Waterline эта цифра вырастает до одного гигабайта. Аналогичную точку зрения высказал резидент Hacker News и отметил, что PostgREST — это первый инструмент на Haskell, который он развернул в продакшн.

Фото — Charles— Unsplash

Но есть в комьюнити и те, кто критикует PostgREST. Один из пользователей заметил, что код на Haskell сложно читать, поэтому отладка подобных библиотек в продакшн-среде может вызывать определенные затруднения. При этом инструмент, по сути, передает задачи по обработке бизнес-логики от бэкенда базе данных — так поступали более десяти лет назад. В связи с этим есть мнение, что вместо PostgREST лучше писать ограничения (constraints) на обычном SQL.

Другой пользователь с HN говорит, что веб-сервер пригоден лишь для развертки временных приложений. В долгосрочной перспективе могут возникнуть сложности со структурой базы данных — схема БД становится API-схемой, а для неё нужно строить отдельные представления.

Какие есть аналоги

PostgREST не единственный веб-сервер, который позволяет работать с базами данных по API. Например, есть Hasura — легковесный GraphQL-сервер, который играет роль посредника между веб-приложением и PostgreSQL. Система сгенерирует GraphQL-схему на основе существующей БД или создаст новую. Также она умеет работать с GraphQL Subscriptions, осуществляет динамический контроль прав доступа и генерацию запросов на объединение таблиц.

Сегодня Hasura используют многие компании — в том числе из списка Fortune 500. И у системы есть интеграции с облачными платформами крупнейших западных IaaS-провайдеров.

Еще можно отметить Prisma — сервис тоже призван заменить традиционные ORM. Но в отличие от PostgREST и Hasura решение работает сразу с несколькими базами данных — PostgreSQL, MySQL и MongoDB. В результате пользователи получают гибкий инструмент для работы, однако это сказывается на его функциональности. Например, в Prisma нельзя отсортировать по двум ключам. Но учитывая, что инструмент активно поддерживается (у него более 16 тыс. звезд на GitHub), его возможности будут расширены в будущем.

Дополнительное чтение из корпоративного блога 1cloud.ru:

  1. Как сэкономить с помощью прикладного программного интерфейса (API)
  2. Как IaaS помогает франчайзи «1С»: опыт 1cloud
  3. Как разработчики приложений используют виртуальный контейнер?

P.S. Мы в 1cloud предлагаем услугу «Облачное объектное хранилище». Оно подойдет для резервных копий, архивных данных и данных веб-приложений. Стоимость аренды складывается из двух составляющих: хранение и исходящий трафик.

ЛУЧШИЕ СТАТЬИ ПО ТЕМЕ

matyushkin
12 мая 2020

Как запустить веб-приложение на Nginx в Docker 🐳👨🏽‍💻

Инструкция по настройке совместной работы веб-приложения и сервера Nginx в ...
Библиотека программиста
19 июня 2018

Что нужно знать, чтобы стать бэкенд-разработчиком в 2018

В этой статье речь пойдёт о том, какими языками и инструментами необходимо ...