gpt4 book ai didi

json - 将 2 个 REST 端点合并到单个 GraphQL 响应

转载 作者:行者123 更新时间:2023-12-04 12:39:35 25 4
gpt4 key购买 nike

GraphQL 新手,我使用以下架构:

type Item {
id: String,
valueA: Float,
valueB: Float
}

type Query {
items(ids: [String]!): [Item]
}

我的 API 可以在每种类型(A 和 B)的单个请求上返回多个项目,但不能同时返回,即:

typeA 的 REST 请求: api/a/items?id=[1,2]回复:
[
{"id":1,"value":100},
{"id":2,"value":30}
]

typeB 的 REST 请求: api/b/items?id=[1,2]回复:
[
{"id":1,"value":50},
{"id":2,"value":20}
]

我想将这 2 个 api 端点合并为一个单一的 graphQL 响应,如下所示:
[
{
id: "1",
valueA: 100,
valueB: 50
},
{
id: "2",
valueA: 30,
valueB: 20
}
]

问:如何编写一个解析器来运行 单例获取每种类型(获取多个项目响应)确保在查询缺少类型时不会触发不必要的获取,即:
{items(ids:["1","2"]) {
id
valueA
}}

上面的例子应该只获取 api/a/items?id=[1,2]并且 graphQL 响应应该是:
[
{
id: "1",
valueA: 100
},
{
id: "2",
valueA: 30
}
]

最佳答案

所以我假设你使用 JavaScript 作为语言。在这种情况下,您需要的不是使用直接查询,而是使用片段

所以查询将变成

{
items(ids:["1","2"]) {
...data
}}

fragment data on Item {
id
valueA
}
}

接下来在解析器中,我们需要访问这些片段以找到作为片段一部分的字段,然后基于这些字段解析数据。下面是一个简单的 nodejs 文件
const util = require('util');

var { graphql, buildSchema } = require('graphql');

var schema = buildSchema(`
type Item {
id: String,
valueA: Float,
valueB: Float
}

type Query {
items(ids: [String]!): [Item]
}
`);

var root = { items: (source, args, root) => {
var fields = root.fragments.data.selectionSet.selections.map(f => f.name.value);
var ids = source["ids"];

var data = ids.map(id => {return {id: id}});
if (fields.indexOf("valueA") != -1)
{
// Query api/a/items?id=[ids]
//append to data;
console.log("calling API A")
data[0]["valueA"] = 0.12;
data[1]["valueA"] = 0.15;
}

if (fields.indexOf("valueB") != -1)
{
// Query api/b/items?id=[ids]
//append to data;
console.log("calling API B")
data[0]["valueB"] = 0.10;
data[1]["valueB"] = 0.11;
}
return data
},
};

graphql(schema, `{items(ids:["1","2"]) {
...data
}}

fragment data on Item {
id
valueA
}

`, root).then((response) => {
console.log(util.inspect(response, {showHidden: false, depth: null}));
});

如果我们运行它,输出是
calling API A
{ data:
{ items: [ { id: '1', valueA: 0.12 }, { id: '2', valueA: 0.15 } ] } }

如果我们将查询更改为
{
items(ids:["1","2"]) {
...data
}}

fragment data on Item {
id
valueA
valueB
}
}

输出是
calling API A
calling API B
{ data:
{ items:
[ { id: '1', valueA: 0.12, valueB: 0.1 },
{ id: '2', valueA: 0.15, valueB: 0.11 } ] } }

因此,这演示了如何在不需要它们的字段时避免调用 api A/B。正如你所要求的

关于json - 将 2 个 REST 端点合并到单个 GraphQL 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47053844/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com