【问题标题】:Generate Graphql schema from json api response从 json api 响应生成 Graphql 模式
【发布时间】: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-graphqlgraphql-liftoff 之类的内容

标签: schema graphql apollo-server


【解决方案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
    }
    

    【讨论】:

      猜你喜欢
      • 2019-05-11
      • 2023-03-25
      • 2020-12-05
      • 2023-04-01
      • 2020-01-15
      • 2017-02-22
      • 2019-09-11
      • 2019-06-23
      • 2019-09-08
      相关资源
      最近更新 更多