我将给出一个关于GitHub GraphQL API的具体例子(这是我想解决的特殊问题),但是这个问题似乎一般可以推广到GraphQL。
假设我想为存储库py手电筒/py手电筒上的第1234个问题添加一个标签“高优先级”。根据API文档,我应该使用突变https://developer.github.com/v4/mutation/addlabelstolabelable/作为输入要求:
labelIds ([ID!]!)
The ids of the labels to add.
labelableId (ID!)
The id of the labelable object to add labels to.好的,我怎么拿到身份证?在我的代码中,我知道我想要标签“高优先级”,但是要真正地将这一点传递给这种突变,我必须首先将“高优先级”解析为ID,但首先要执行另一个GraphQL调用。对于我想要标记的内容也是如此:我有一个唯一的标识符,形式是py手电/py手电#1234,但是我没有ID,我必须查找它。)
因此,在一天结束时,我必须执行三个 API调用来标记某物,而我本来可以在REST中完成它,而只需一个调用即可。通常,我看到许多只在In中使用的GraphQL变异API(即使在系统有其他规范标识符可用时也是如此),最后我不得不执行额外的往返任务。我做错了吗?或者GraphQL真的是这样设计的?
发布于 2019-06-05 17:14:53
根据等级库,GraphQL文档可能包含任意数量的操作,其中一个操作是query、mutation或subscription之一。
对于特定的请求只能执行一个操作(如果提供了一个以上的操作,则必须提供一个operationName来指定要执行的操作)。
然而,在该行动中,任何数目的字段都可能被请求。因此,如果需要两个或多个根级查询字段(通俗地称为“查询”),则可以将它们合并到一个操作中:
query ArbitraryOperationName {
getSomething
getSomethingElse
}同样适用于突变--您可以执行两个或多个突变(按顺序排列):
mutation ArbitraryOperationName {
doSomething
doSomethingElse
doAThirdAction
}因此,需要将请求拆分为多个请求的唯一方案是:
query和mutation --它们是单独的操作,因此它们必须单独发送。您应该能够在一个查询中获得标签ID和问题ID:
query {
repository(owner: "graphql", name: "graphql-js") {
label(name: "help wanted") {
id
}
issue(number: 100) {
id
}
}
}但是,您的突变必须是一个单独的请求,因为1)它是一个不同的操作,2)它需要作为输入数据返回上述查询。
尽管如此,addlabelstolabelable要求您输入in而不是标签名和in,而不是问题/PRs的数字,这是Github的一个设计选择。虽然在变异参数中看到由某种id字段显式引用的实体是相当常见的,但规范中没有任何东西禁止突变接受其他标识符作为输入。
https://stackoverflow.com/questions/56464529
复制相似问题