LINUX.ORG.RU

Генерация json-rpc api из схемы базы данных

 , ,


2

4

Короче появилась у меня идея генерировать API из схемы базы данных, но все не доходили руки. На той неделе я набросал 120 строк как пробу пера и забил. Вчера отредактировал тот быдлокод и залил на гитхаб.

Ссылка

Сейчас я придумал как сделать авторизацию через jwt для защиты приложения, но до реализации руки не дошли. Прошу покритиковать идею.

Создаем схему и тестовую функцию:

drop schema if exists foo cascade;
create schema foo;
create or replace function foo.hello(name text default 'world') returns text as $$
  select format('Hello, %s!', name);
$$ language sql;

Натравливаем скрипт на схему:

$ cd scripts
$ ./pgrpc postgres://postgres@/test --schema foo --debug true

Проверяем:

$ curl -XPOST -d '{"id": 123, "method": "hello"}' http://0.0.0.0:8080/jsonrpc
{
  "jsonrpc": "2.0",
  "error": {
    "code": -32600,
    "message": "missing required fields: jsonrpc"
  },
  "id": 123
}
$ curl -XPOST -d '{"id": 123, "method": "hello", "jsonrpc": "2.0", "foo": "bar"}' http://0.0.0.0:8080/jsonrpc
{
  "jsonrpc": "2.0",
  "error": {
    "code": -32600,
    "message": "unknown fields: foo"
  },
  "id": 123
}
$ curl -XPOST -d '{"id": 123, "method": "hello", "params": ["sergey"], "jsonrpc": "2.0"}' http://0.0.0.0:8080/jsonrpc
{
  "jsonrpc": "2.0",
  "result": {
    "hello": "Hello, sergey!"
  },
  "id": 123
}
$ curl -XPOST -d '{"id": 123, "method": "hello", "params": {"name": "sergey"}, "jsonrpc": "2.0"}' http://0.0.0.0:8080/jsonrpc
{
  "jsonrpc": "2.0",
  "result": {
    "hello": "Hello, sergey!"
  },
  "id": 123
}
$ curl -XPOST -d '{"id": 123, "method": "hello", "params": {"name": -1}, "jsonrpc": "2.0"}' http://0.0.0.0:8080/jsonrpc
{
  "jsonrpc": "2.0",
  "error": {
    "code": -32603,
    "message": "invalid input for query argument $1: -1 (expected str, got int)"
  },
  "id": 123
}
$ curl -XPOST -d '{"id": 123, "method": "hello", "params": {"name": "sergey", "foo": "bar"}, "jsonrpc": "2.0"}' http://0.0.0.0:8080/jsonrpc
{
  "jsonrpc": "2.0",
  "error": {
    "code": -32602,
    "message": "unknown params: foo"
  },
  "id": 123
}
★★

Последнее исправление: tz4678 (всего исправлений: 1)

Генератор веб морды к хранимкам?

Имхо - гениально. Интересно, а сишные расширения так вызывать можно будет?

Помимо всего прочего, было бы интересно, как автор видит наиболее вероятный вывод не интерфейсной хранимки в json представлении. Т.е. как будет выглядеть выхлоп возвращающий dataset.

onhydro
()
Ответ на: комментарий от MLP_Fan

Там вроде про данные, а тут про выхлоп хранимок. Что в корне верно, ибо пусть сервер данных занимается обработкой данных, он для этого был спроектирован. Транспорт и протокол имхо тоже лучшие выбраны как старт. Ну если ещё вебсокетов только завести, для большего web 2.0.

onhydro
()
Ответ на: комментарий от onhydro

А чем graphQL не угодил? В нем подписки на вебсокетах тоже есть да и использовать его удобнее с современным фронтэндом.

MLP_Fan ★★
()

Сейчас я придумал как сделать авторизацию через jwt

Не очень юниксвейнинько. Пусть каждый свои морды защищает как ему удобно? Тема обширная и не налажать в ней крайне сложно(я про аутентификацию).

onhydro
()
Ответ на: комментарий от tz4678

Я переписал проект чтобы он стандартам соответствовал, но до какого-то потребительского вида еще далеко. Кто-нибудь хочет помочь дописать/переписать? Либо какие-нибудь пожелания высказать?

Я сейчас думаю что первым делом сделать jwt или веб-сокеты?

tz4678 ★★
() автор топика
Ответ на: комментарий от onhydro

Добавил работу через вебсокеты:

$ websocat ws://0.0.0.0:9123/rpc/
{"id": 123, "method": "hello", "jsonrpc": "2.0"}
{"jsonrpc": "2.0", "id": 123, "result": {"hello": "Hello, world!"}}
{"id": 123, "method": "hello", "jsonrpc": "2.0", "foo": "bar"}
{"jsonrpc": "2.0", "id": null, "error": {"code": -32600, "message": "Invalid request", "data": "Additional properties are not allowed ('foo' was unexpected)\n\nFailed validating 'additionalProperties' in schema:\n    {'$schema': 'http://json-schema.org/draft-07/schema#',\n     'additionalProperties': False,\n     'properties': {'id': {'type': ['integer', 'string']},\n                    'jsonrpc': {'const': '2.0', 'type': 'string'},\n                    'method': {'type': 'string'},\n                    'params': {'type': 'object'}},\n     'required': ['jsonrpc', 'id', 'method'],\n     'type': 'object'}\n\nOn instance:\n    {'foo': 'bar', 'id': 123, 'jsonrpc': '2.0', 'method': 'hello'}"}}
{"id": 123, "method": "hello", "params": {"name": "sergey"}, "jsonrpc": "2.0"}
{"jsonrpc": "2.0", "id": 123, "result": {"hello": "Hello, sergey!"}}
{"id": 123, "method": "hello", "params": {"name": 42}, "jsonrpc": "2.0"}
{"jsonrpc": "2.0", "id": 123, "error": {"code": -32603, "message": "Internal error", "data": "invalid input for query argument $1: 42 (expected str, got int)"}}
{"id": 123, "method": "hello", "params": {"name": "sergey", "foo": "bar"}, "jsonrpc": "2.0"}
{"jsonrpc": "2.0", "id": 123, "error": {"code": -32602, "message": "Invalid params", "data": "unknown params: foo"}}
tz4678 ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.