通过 graphql 端点按 ID 获取 github 个问题

get github issues by their ids through graphql endpoints

我正在尝试使用 graphql 从 Github 通过问题的 ID 获取问题列表,但看起来我遗漏了一些东西或者它不可能。

query ($ids:['517','510']!) {
  repository(owner:"owner", name:"repo") {
    issues(last:20, states:CLOSED) {
      edges {
        node {
          title
          url
          body
          author{
            login
          }
          labels(first:5) {
            edges {
              node {
                name
              }
            }
          }
        }
      }
    }
  }
}

上面的查询给我的回复如下,

{
  "errors": [
    {
      "message": "Parse error on \"'\" (error) at [1, 14]",
      "locations": [
        {
          "line": 1,
          "column": 14
        }
      ]
    }
  ]
}

请帮助我确定是否可能或者我在这里做错了什么。

我认为您无法获取 issues 并为其 id 传入一个整数数组。

但是你可以像这样id搜索单个问题(这对我有用)

query ($n: Int!) {
  repository(owner:"owner", name:"repo-name") {
    issue (number: $n) {
      state
      title
      author {
        url
      }
    }
  }
}

其中 $n{"n": <your_number>} 定义。

如果您有一个 id 数组,那么您可以对 GitHub.

进行多次查询

遗憾的是,使用这种方法,您无法指定问题的 state 是什么。但我认为逻辑是,一旦你知道问题 ID,你就不应该关心它是什么状态,因为你有那个确切的 ID。

您可以使用 aliases 来构建请求多个 issue 对象的单个请求:

{
  repository(name: "material-ui", owner: "mui-org") {
    issue1: issue(number: 2) {
      title
      createdAt
    }
    issue2: issue(number: 3) {
      title
      createdAt
    }
    issue3: issue(number: 10) {
      title
      createdAt
    }
  }
}

Try it in the explorer

给出:

{
  "data": {
    "repository": {
      "issue1": {
        "title": "Support for ref's on Input component",
        "createdAt": "2014-10-15T15:49:13Z"
      },
      "issue2": {
        "title": "Unable to pass onChange event to Input component",
        "createdAt": "2014-10-15T16:23:28Z"
      },
      "issue3": {
        "title": "Is it possible for me to make this work if I'm using React version 0.12.0?",
        "createdAt": "2014-10-30T14:11:59Z"
      }
    }
  }
}

也可以使用 fragments 来简化此请求以防止重复:

{
  repository(name: "material-ui", owner: "mui-org") {
    issue1: issue(number: 2) {
      ...IssueFragment
    }
    issue2: issue(number: 3) {
      ...IssueFragment
    }
    issue3: issue(number: 10) {
      ...IssueFragment
    }
  }
}

fragment IssueFragment on Issue {
  title
  createdAt
}

可以通过编程方式构建请求,例如本例中的 脚本:

import requests

token = "YOUR_TOKEN"
issueIds = [2,3,10]
repoName = "material-ui"
repoOwner = "mui-org"

query = """
query($name: String!, $owner: String!) {
  repository(name: $name, owner: $owner) {
    %s
  }
}

fragment IssueFragment on Issue {
  title
  createdAt
}
"""

issueFragments = "".join([
    """
    issue%d: issue(number: %d) {
      ...IssueFragment
    }""" % (t,t) for t in issueIds
])
r = requests.post("https://api.github.com/graphql",
    headers = {
        "Authorization": f"Bearer {token}"
    },
    json = {
        "query": query % issueFragments,
        "variables": {
            "name": repoName,
            "owner": repoOwner
        }
    }
)
print(r.json()["data"]["repository"])