【问题标题】:GitHub GraphQL filter multi variable language filterGitHub GraphQL 过滤器 多变量语言过滤器
【发布时间】:2020-10-11 23:01:50
【问题描述】:

我正在尝试使用 GitHub 的 GraphQL API 来查找与查询匹配但仅限于特定语言的存储库列表。但是,我在文档中找不到与典型在线搜索支持的多变量语言过滤器相关的任何内容,或者通常如何使用 GraphQL 完成此类操作。

{
  search(query: "language:java", type: REPOSITORY, first: 10) {
    repositoryCount
    edges {
      node {
        ... on Repository {
          nameWithOwner
          forkCount
          hasIssuesEnabled
          hasProjectsEnabled
          homepageUrl
          id
        }
      }
    }
  } 
}

我想传递两个关于语言的参数并显示结果,但是这个query 只是使用字符串来搜索。我需要像这样的多个项目发送请求 language:['go','java','javaScript']

【问题讨论】:

    标签: graphql github-api github-graphql


    【解决方案1】:

    作为一种解决方法,您可以使用aliases 构建动态查询,其中包含许多针对特定语言的search 查询和fragments 以避免在查询中重复SearchResultItemConnection

    {
      go: search(query: "language:go", type: REPOSITORY, first: 10) {
        ...SearchResult
      }
      java: search(query: "language:java", type: REPOSITORY, first: 10) {
        ...SearchResult
      }
      javascript: search(query: "language:javascript", type: REPOSITORY, first: 10) {
        ...SearchResult
      }
    }
    
    fragment SearchResult on SearchResultItemConnection {
      repositoryCount
      edges {
        node {
          ... on Repository {
            nameWithOwner
            forkCount
            hasIssuesEnabled
            hasProjectsEnabled
            homepageUrl
            id
          }
        }
      }
    }
    

    Try it in the explorer

    请注意,它仅适用于 OR 查询(java 或 javascript 或转到语言列表),但不适用于 AND

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

    import requests
    
    token = "YOUR_TOKEN"
    languages = ["go","java","javaScript"]
    
    query = """
    {
      %s
    }
    
    fragment SearchResult on SearchResultItemConnection {
      repositoryCount
      edges {
        node {
          ... on Repository {
            nameWithOwner
            forkCount
            hasIssuesEnabled
            hasProjectsEnabled
            homepageUrl
            id
          }
        }
      }
    }
    """
    
    searchFragments = "".join([
        """
        %s: search(query: "language:%s", type: REPOSITORY, first: 10) {
          ...SearchResult
        }
        """ % (t,t) for t in languages
    ])
    r = requests.post("https://api.github.com/graphql",
        headers = {
            "Authorization": f"Bearer {token}"
        },
        json = {
            "query": query % searchFragments
        }
    )
    print(r.json()["data"])
    

    【讨论】:

      猜你喜欢
      • 2018-12-05
      • 1970-01-01
      • 1970-01-01
      • 2018-03-11
      • 2021-09-02
      • 2013-09-04
      • 1970-01-01
      • 1970-01-01
      • 2021-09-23
      相关资源
      最近更新 更多