Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我可以从GraphQL模式生成REST服务吗?_Python_Django_Django Rest Framework_Graphql_Graphene Python - Fatal编程技术网

Python 我可以从GraphQL模式生成REST服务吗?

Python 我可以从GraphQL模式生成REST服务吗?,python,django,django-rest-framework,graphql,graphene-python,Python,Django,Django Rest Framework,Graphql,Graphene Python,我想用GraphQL端点和RESTAPI构建一个Django应用程序。将两者分开维护将是一件非常痛苦的事情;我正在寻找一种只维护GraphQL服务并自动生成其余端点的好方法 有人知道这样做的好方法吗 我知道有很多方法可以在REST端点之上构建GraphQL服务器,但我更愿意采用另一种方法,因为REST API要求可能在将来消失。如果您唯一的问题是客户端没有专用的客户端,并且您可以使用长URL,那么您的graphql端点就是类似REST的API。免责声明:未经测试的代码仅用于教育目的;) 阅读所有

我想用GraphQL端点和RESTAPI构建一个Django应用程序。将两者分开维护将是一件非常痛苦的事情;我正在寻找一种只维护GraphQL服务并自动生成其余端点的好方法

有人知道这样做的好方法吗


我知道有很多方法可以在REST端点之上构建GraphQL服务器,但我更愿意采用另一种方法,因为REST API要求可能在将来消失。

如果您唯一的问题是客户端没有专用的客户端,并且您可以使用长URL,那么您的graphql端点就是类似REST的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的方式工作(想象一下调用RESTAPI的redux操作)

如果您希望在服务器方面有更多的东西,您可以轻松地颠倒您在此处描述的内容:

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

您可以构建一个代理,将REST查询重写为GraphQL查询。这可能比将REST端点映射到GraphQL容易得多,因为GraphQLAPI功能强大得多

一些node.js express代码,因为我不懂python:(


如果您不介意使用Node.js,那么有一个库可以做到这一点(graphql2rest):

您可以使用它从现有的GraphQL模式自动生成RESTAPI


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

虽然我喜欢你的方法,但它对我们不起作用。我们希望保持REST的原因是确保我们的客户可以继续使用遗留软件连接到aur API;任何期望REST的软件都会在vanilla GQL上崩溃。我可以创建URL的外观(可能还有一些请求/响应重构)按照您的建议模拟REST API,但我担心这比同时运行REST和GQL更难维护。当然,从性能角度来看,这可能仍然是一个非常糟糕的主意,尤其是对于单个资源。假设您的应用程序通过级联的资源请求执行经典REST,那么您的GraphQL端点会得到很多GraphQL是一种比REST更好的折衷方法,因为它摆脱了REST的限制。已经有一段时间了,所以我不打算对此进行测试。相反,我将接受这一点作为一个答案,假设库按照宣传的方式工作,因为它解决了我当时的问题。
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
  });
});