从 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 实现中获得回声?