从 json api 响应生成 Graphql 模式

Posted

技术标签:

【中文标题】从 json api 响应生成 Graphql 模式【英文标题】:Generate Graphql schema from json api response 【发布时间】:2019-04-20 12:29:37 【问题描述】:

我使用 Apollo server 2.0 作为我的 rest api(不同的微服务)上的 graphql 聚合层。

我想直接从微服务的 api 响应中生成 graphql 架构,而不是手动编写它们,这可能容易出错。

例如,如果我的 api 响应是

const restApiResponse = 
  "id": 512,
  "personName": "Caribbean T20 2016",
  "personShortName": "caribbean-t20 2016",
  "startDate": "2016-06-29T19:30:00.000Z",
  "endDate": "2016-08-08T18:29:59.000Z",
  "status": 0,
;

然后我想根据提供的 typeName 生成以下架构,例如 Person -

type Person 
  id: Float
  personName: String
  personShortName: String
  startDate: String
  endDate: String
  status: Float

【问题讨论】:

您目前使用什么来验证这些 REST 端点的响应? @Daniel 首先我没有得到“响应验证”部分。但现在不进行响应验证。它完全是从头开始编写的。 不确定在这种情况下“从头开始编写”是什么意思。看到某种形式的响应(输出)验证是很常见的——即一种机制,可以根据某些模式验证您的响应。 Swagger、Joi 和 JSON Schema 都是这样的例子。我问的原因是,如果您已经在使用类似的东西,那么很有可能有一个工具可以将该模式转换为 GraphQL 模式。 @DanielRearden 哦,是的,我记得我们声明了一个 yaml 文件。但在这种情况下,我没有任何架构验证。 因此您可以查看swagger-to-graphql 或graphql-liftoff 之类的内容 【参考方案1】:

这并不能真正回答您的问题,但我建议您不要这样做。 GraphQL 将自己定义为“毫无歉意地由客户端驱动”,这向我表明,您定义的每个查询都应该明确定义为客户特别想要的东西。如果你只有 FLAT 数据,你不需要 GraphQL,REST 就足够了。如果您不这样做,您将需要以客户想要的方式仔细制作并专门嵌套您的数据,并且对您的 UI 有意义。有很多工具可以让这更容易,但我建议不要使用你的要求。

【讨论】:

【参考方案2】:

最后经过大量搜索和查找,我写了一个脚本来为我做这件事 -

这有一些小问题,例如 int 被解析为 Floats 但没关系,因为如果需要我可以用 int 替换它们。

const  composeWithJson  = require('graphql-compose-json');
const  GQC  = require('graphql-compose');
const  printSchema  = require('graphql'); // CommonJS


const restApiResponse = 
    "id": 399,
    "templateId": 115,
    "amount": 100000,
    "amountINR": 100000,
    "amountUSD": 0,
    "currencyCode": "INR",
    "createdAt": "2018-06-07T00:08:28.000Z",
    "createdBy": 36,
;

const GqlType = composeWithJson('Template', restApiResponse);
const PersonGraphQLType = GqlType.getType();

GqlType.addResolver(
    name: 'findById',
    type: GqlType,
    args: 
      id: 'Int!',
    ,
    resolve: rp => 
    ,
  );

  GQC.rootQuery().addFields(
    person: GqlType.getResolver('findById'),
  );

const schema = GQC.buildSchema();

console.log(printSchema(schema));

它会生成这样的输出 -

type Template 
  id: Float
  templateId: Float
  amount: Float
  amountINR: Float
  amountUSD: Float
  currencyCode: String
  createdAt: String
  createdBy: Float

【讨论】:

以上是关于从 json api 响应生成 Graphql 模式的主要内容,如果未能解决你的问题,请参考以下文章

Python - 如何从 GraphQL api 获取 JSON?

GraphQL Elixir/Phoenix API:Socket 挂起,响应很大

GitHub GraphQL API 的 Apollo 客户端响应不是 JSON 格式

从 prisma 生成的客户端访问 graphql 服务器中的数据类型

如何从 REST API 定义多个或嵌套 json 数据的数组类型

Webonyx/Graphql-php 入门:如何在 cURL 中获取 API 的响应而不会从 API 实现中获得回声?