首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GraphQL:在一个网络调用中查询和变异

GraphQL:在一个网络调用中查询和变异
EN

Stack Overflow用户
提问于 2019-06-05 16:27:21
回答 1查看 692关注 0票数 4

我将给出一个关于GitHub GraphQL API的具体例子(这是我想解决的特殊问题),但是这个问题似乎一般可以推广到GraphQL。

假设我想为存储库py手电筒/py手电筒上的第1234个问题添加一个标签“高优先级”。根据API文档,我应该使用突变https://developer.github.com/v4/mutation/addlabelstolabelable/作为输入要求:

代码语言:javascript
复制
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真的是这样设计的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-05 17:14:53

根据等级库,GraphQL文档可能包含任意数量的操作,其中一个操作是querymutationsubscription之一。

  • 查询-一个只读的获取。
  • 突变-一种书写,然后是一次提取。
  • 订阅--获取响应源事件的数据的长期请求。

对于特定的请求只能执行一个操作(如果提供了一个以上的操作,则必须提供一个operationName来指定要执行的操作)。

然而,在该行动中,任何数目的字段都可能被请求。因此,如果需要两个或多个根级查询字段(通俗地称为“查询”),则可以将它们合并到一个操作中:

代码语言:javascript
复制
query ArbitraryOperationName {
  getSomething
  getSomethingElse
}

同样适用于突变--您可以执行两个或多个突变(按顺序排列):

代码语言:javascript
复制
mutation ArbitraryOperationName {
  doSomething
  doSomethingElse
  doAThirdAction
}

因此,需要将请求拆分为多个请求的唯一方案是:

  • 您需要同时执行querymutation --它们是单独的操作,因此它们必须单独发送。
  • 您需要将一个查询的部分结果作为另一个查询的输入。

您应该能够在一个查询中获得标签ID和问题ID:

代码语言:javascript
复制
query {
  repository(owner: "graphql", name: "graphql-js") {
    label(name: "help wanted") {
      id
    }
    issue(number: 100) {
      id
    }
  }
}

但是,您的突变必须是一个单独的请求,因为1)它是一个不同的操作,2)它需要作为输入数据返回上述查询。

尽管如此,addlabelstolabelable要求您输入in而不是标签名和in,而不是问题/PRs的数字,这是Github的一个设计选择。虽然在变异参数中看到由某种id字段显式引用的实体是相当常见的,但规范中没有任何东西禁止突变接受其他标识符作为输入。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56464529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档