【问题标题】:Can I generate a REST service from a GraphQL schema?我可以从 GraphQL 模式生成 REST 服务吗?
【发布时间】:2018-06-15 09:53:41
【问题描述】:

我想构建一个同时具有 GraphQL 端点和 REST API 的 Django 应用程序。分别维护两者太痛苦了;我正在寻找一种只维护 GraphQL 服务并自动生成 REST 端点的好方法。

有谁知道这样做的好方法吗?

我知道有多种方法可以在 REST 端点之上构建 GraphQL 服务器,但我宁愿反过来,因为 REST API 要求将来可能会消失。

【问题讨论】:

    标签: python django django-rest-framework graphql graphene-python


    【解决方案1】:

    如果你不介意使用 Node.js,有一个库可以做到这一点 (graphql2rest):https://github.com/sisense/graphql2rest

    您可以使用它从现有的 GraphQL 架构中自动生成 REST API。

    “GraphQL2REST 是一个 Node.js 库,它可以读取您的 GraphQL 架构和用户提供的清单文件,并自动生成一个具有完全 RESTful HTTP 路由的 Express 路由器 — 一个成熟的 REST API。”

    【讨论】:

    • 已经有一段时间了,所以我不打算测试这个。相反,我会接受这个作为答案,假设图书馆像宣传的那样工作,因为它会解决我当时的问题。
    【解决方案2】:

    如果您唯一的问题是在客户端没有专用客户端,并且您可以使用长 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 的 redux 操作)。

    如果您想要更多关于服务器的内容,您可以轻松地反转您在此处描述的内容:

    我知道有多种方法可以在 REST 端点之上构建 GraphQL 服务器,

    您可以构建一个代理,将您的 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
      });
    });
    

    【讨论】:

    • 虽然我喜欢你的方法,但它对我们不起作用。我们想要保留 REST 的原因是确保我们的客户可以继续使用遗留软件连接到 aur API;任何期望 REST 的软件都会在 vanilla GQL 上崩溃。我可以创建一个 url 的外观(可能还有一些请求/响应重组)来模仿你建议的 REST API,但我担心这比只运行 REST 和 GQL 端更难维护并排。
    • 当然。就性能而言,这可能仍然是一个非常糟糕的主意,尤其是在单一资源的情况下。假设您的应用程序执行具有级联资源请求的经典 REST,您的 GraphQL 端点会获得大量未针对其进行优化的负载。 GraphQL 是一种比 REST 更有效的折衷方案,因为它摆脱了 REST 的限制。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 2020-12-05
    • 2023-04-01
    • 2020-01-15
    • 2018-07-01
    相关资源
    最近更新 更多