Могу ли я создать службу REST из схемы GraphQL?

Я хотел бы создать приложение Django с конечной точкой GraphQL и REST API. Поддерживать оба по отдельности было бы слишком сложно; Я ищу хороший способ поддерживать только службу GraphQL и автоматически генерировать конечные точки REST.

Кто-нибудь знает о хорошем способе сделать это?

Я знаю, что есть способы построить сервер GraphQL поверх конечных точек REST, но я бы предпочел, чтобы это было наоборот, так как требование REST API может исчезнуть в будущем.


person czert    schedule 05.01.2018    source источник


Ответы (2)


Если вы не возражаете против использования Node.js, для этого есть библиотека (graphql2rest): https://github.com/sisense/graphql2rest

Вы можете использовать его для автоматического создания REST API из существующей схемы GraphQL.

«GraphQL2REST — это библиотека Node.js, которая считывает вашу схему GraphQL и файл манифеста, предоставленный пользователем, и автоматически создает маршрутизатор Express с полностью HTTP-маршрутами RESTful — полноценный REST API».

person bravo2020    schedule 31.05.2020
comment
Прошло некоторое время, поэтому я не собираюсь проверять это. Вместо этого я собираюсь принять это как ответ, предполагая, что библиотека работает так, как рекламируется, поскольку тогда она решила бы мою проблему. - person czert; 01.06.2020

Если ваша единственная проблема заключается в отсутствии выделенного клиента на стороне клиента, и вы можете жить с длинными URL-адресами, ваша конечная точка graphql является вашим RESTlike API. Отказ от ответственности: непроверенный код только для образовательных целей;)

Читать все сообщения:

GET /api/posts
=>
GET /graphql?query={posts{id title body}}

Создать сообщение

POST /api/posts
{ "title": "Hello", "body": "world" }
=>
POST /graphql?query=mutation m($title:String!,$body:String!){createPost(title:$title,body:$body){id title body}
{ "variables": { "title": "Hello", "body": "world" } }

Затем ваш код может работать в стиле REST (представьте, что избыточные действия вызывают REST API).

Если вы хотите чего-то большего с точки зрения сервера, вы можете легко изменить то, что вы описали здесь:

Я знаю, что есть способы построить сервер GraphQL поверх конечных точек REST,

Вы можете создать прокси, который переписывает ваши запросы REST в запросы GraphQL. Это может быть намного проще, чем сопоставление конечной точки REST с GraphQL, поскольку ваш GraphQL API намного мощнее.

Некоторый экспресс-код node.js, так как я не знаю никакого python :(

const Lokka = require('lokka').Lokka;
const Transport = require('lokka-transport-http').Transport;
const express = require('express');

const client = new Lokka({
  transport: new Transport('...')
});

const app = express();
app.get('/api/posts', (req, res) => {
  client.query('{posts{id title body}}').then(result => {
    res.status(200).send(result);
  }).catch(error => {
    res.status(500).end(); // Or other error handling
  });
});
person Herku    schedule 06.01.2018
comment
Хотя мне нравится ваш подход, он не сработает для нас. Причина, по которой мы хотим сохранить REST, заключается в том, чтобы наши клиенты могли продолжать использовать устаревшее программное обеспечение для подключения к API aur; любое программное обеспечение, ожидающее REST, сломается на vanilla GQL. Я мог бы создать фасад URL-адресов (и, возможно, некоторую реструктуризацию запроса/ответа), чтобы имитировать REST API, как вы предлагаете, но я боюсь, что это будет еще сложнее поддерживать, чем просто запускать как REST, так и GQL. рядом. - person czert; 08.01.2018
comment
Причина. Однако с точки зрения производительности это может быть очень плохой идеей, особенно с отдельными ресурсами. Предполагая, что ваше приложение выполняет классический REST с каскадными запросами ресурсов, ваша конечная точка GraphQL получает большую нагрузку, для которой она не оптимизирована. GraphQL — это компромисс, который работает лучше, чем REST, потому что избавляется от ограничений REST. - person Herku; 09.11.2018