从 json api 响应生成 Graphql 模式
Generate Graphql schema from json api response
我正在使用 Apollo 服务器 2.0 作为 graphql 聚合层在我的休息 apis(不同的微服务)。
我想直接从微服务的 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
}
这并不能真正回答您的问题,但我建议您不要这样做。 GraphQL 将自己定义为 "unapologetically client-driven",这对我来说意味着你定义的每个查询都应该明确定义为客户特别想要的东西。如果只有 FLAT 数据,则不需要 GraphQL,REST 就足够了。如果不这样做,您将需要按照客户想要的方式精心制作和专门嵌套您的数据,并且对您的 UI 有意义。有很多工具可以使这更容易,但我会反对你的要求。
经过大量搜索和查找,我终于写了一个脚本来为我做这件事 -
这里有一些小问题,例如 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
}
我正在使用 Apollo 服务器 2.0 作为 graphql 聚合层在我的休息 apis(不同的微服务)。
我想直接从微服务的 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
}
这并不能真正回答您的问题,但我建议您不要这样做。 GraphQL 将自己定义为 "unapologetically client-driven",这对我来说意味着你定义的每个查询都应该明确定义为客户特别想要的东西。如果只有 FLAT 数据,则不需要 GraphQL,REST 就足够了。如果不这样做,您将需要按照客户想要的方式精心制作和专门嵌套您的数据,并且对您的 UI 有意义。有很多工具可以使这更容易,但我会反对你的要求。
经过大量搜索和查找,我终于写了一个脚本来为我做这件事 -
这里有一些小问题,例如 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
}