6

我希望能够使用他们的 GraphQL API 从 GitHub 检索特定存储库的最新版本。为此,我需要获取 isDraft 和 isPrerelease 为假的最新版本。我设法获得了第一部分,但无法弄清楚如何执行查询的“位置”部分。

这是我得到的基本查询(https://developer.github.com/v4/explorer/):

{
  repository(owner: "paolosalvatori", name: "ServiceBusExplorer") {
    releases(first: 1, orderBy: {field: CREATED_AT, direction: DESC}) {
      nodes {
        name
        tagName
        resourcePath
        isDraft
        isPrerelease
      }
    }
  }
}

返回:

{
  "data": {
    "repository": {
      "releases": {
        "nodes": [
          {
            "name": "3.0.4",
            "tagName": "3.0.4",
            "resourcePath": "/paolosalvatori/ServiceBusExplorer/releases/tag/3.0.4",
            "isDraft": false,
            "isPrerelease": false
          }
        ]
      }
    }
  }
}

我似乎无法找到一种方法来做到这一点。部分原因是我是 GraphQL 新手(第一次尝试进行查询),我不确定如何提出我的问题。

只能基于那些支持参数的类型(如下面的存储库和发布)“查询”吗?似乎应该有一种方法可以在字段值上指定过滤器。

存储库:https ://developer.github.com/v4/object/repository/

发布:https ://developer.github.com/v4/object/releaseconnection/

节点:https ://developer.github.com/v4/object/release/

4

2 回答 2

5

只能基于那些支持参数的类型“查询”

是的:GraphQL 并没有像 SQL 那样定义通用查询语言。您无法以服务器和应用程序架构未提供的方式对字段结果进行排序或过滤。

我希望能够使用他们的 GraphQl API 从 GitHub 检索特定存储库的最新 [非草稿、非预发布] 版本。

正如您已经发现的那样,类型上releases字段Repository没有对这些字段进行排序或过滤的选项。相反,您可以使用多个 GraphQL 调用一次迭代一个版本。这些看起来像

query NextRelease($owner: String!, $name: String!, $after: String) {
  repository(owner: $owner, name: $name) {
    releases(first: 1,
             orderBy: {field: CREATED_AT, direction: DESC},
             after: $after) {
      pageInfo { lastCursor }
      nodes { ... ReleaseData } # from the question
    }
  }
}

以与您现在运行它相同的方式运行它(我已将标识存储库的信息拆分为单独的 GraphQL 变量)。您可以after在第一次调用时保留该变量。如果(如您的示例中)它返回"isDraft": false, "isPrerelease": false,则说明您已设置。如果没有,您需要再试一次:从响应中获取值,然后运行相同的查询,将该游标值作为变量值lastCursor传递。after

于 2019-05-04T11:45:44.400 回答
1
{
  repository(owner: "paolosalvatori", name: "ServiceBusExplorer") {
    releases(first: 1, orderBy: {field: CREATED_AT, direction: DESC}) {
      nodes(isDraft :false , isPrerelease :false ) {
        name
        tagName
        resourcePath
        isDraft
        isPrerelease
      }
    }
  }
}

或者,请查看 GraphQL 指令,因为有时需要根据 @skip 或 @include 值跳过或包含字段。

当在字段或片段上使用时,skip 指令允许我们根据某些条件排除字段。

include 指令允许我们根据某些条件包含字段

GraphQL 指令

于 2019-05-04T00:40:22.057 回答