首页 > 解决方案 > 使用 Github 的 GraphQL 列出所有标签并搜索发布

问题描述

我正在尝试使用 GraphQL 从存储库中获取所有标签,然后(或者如果可能,在同一命令中)获取每个标签发布的一些详细信息。

我正在尝试采用这种方法git/refs/tags->releases/tags/[tag_name]因为列出所有版本releases并没有给我完整的版本列表。

在 v3 中,这等价于:

"https://api.github.com/repos/" + repo + "/git/refs/tags"
"https://api.github.com/repos/" + repo + "/releases/tags/" + tag

GraphQL Explorer中,我能够构建这个查询(替换为您自己的用户名和存储库):

{
  repository(owner: ":UserName", name: ":Repository") {
    refs(refPrefix: "refs/tags/", last: 100) {
      edges {
        node {
          name
        }
      }
    }
  }
}

但它给出了这个结果:

{
  "data": {
    "repository": {
      "refs": {
        "edges": [
          {
            "node": {
              "name": "2.1"
            }
          },
          {
            "node": {
              "name": "2.2"
            }
          },
          {
            "node": {
              "name": "2.3"
            }
          },
 [...]

我也需要以某种方式将其放入查询中(只是一个示例,我也需要其他字段),将nameand using 作为参数:

repository(owner: ":UserName", name: ":Repository") {
  release(tagName: name) {
    name
  }
}

像这样尝试:

query ListTags {
  repository(owner: ":Username", name: ":Repository") {
    refs(refPrefix: "refs/tags/", last: 100) {
      edges {
        node {
          name
          repository {
            release(tagName: Ref.name) {
              name
            }
          }
        }
      }
    }
  }
}

但我无法将其Ref.name用作release.


在我的项目中使用查询时,返回的对象包含所有 JSON 节点,而不仅仅是name字段。

var httpClient = new HttpClient
{
    BaseAddress = new Uri("https://api.github.com/graphql")
};

httpClient.DefaultRequestHeaders.Add("User-Agent", "ReleaseSearcher");

var basicValue = Convert.ToBase64String(Encoding.UTF8.GetBytes($"username:key"));
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", basicValue);

var queryObject = new
{
    query = @"query {
        repository(owner: "":Username"", name: "":repo"") {
            refs(refPrefix: ""refs/tags/"", last: 100) {
                edges {
                    node {
                        name
                    }
                }
            }
        }
    }",
    variables = new { }
};

var request = new HttpRequestMessage
{
    Method = HttpMethod.Post,
    Content = new StringContent(JsonConvert.SerializeObject(queryObject), Encoding.UTF8, "application/json")
};

dynamic responseObj;

using (var response = await httpClient.SendAsync(request))
{
    response.EnsureSuccessStatusCode();

    var responseString = await response.Content.ReadAsStringAsync();
    responseObj = JsonConvert.DeserializeObject<dynamic>(responseString);
}

Console.WriteLine(responseObj.data.viewer.login);
Console.ReadLine();

如何使用标签名称搜索单个版本?

如何正确读取结果数据?

标签: c#gitgraphqlgithub-api

解决方案


我能够得到我想要的:

query {
    rateLimit {
        cost
        remaining
     }
     repository(owner: "NickeManarin", name: "ScreenToGif") {
         refs(refPrefix: "refs/tags/", last: 100) {
             nodes {
                 repository {
                     releases(last: 100, orderBy: { field: CREATED_AT, direction: DESC}) {
                         nodes {
                             name
                             createdAt
                             url
                             releaseAssets(last: 2) {
                                 nodes {
                                     name
                                     downloadCount
                                     downloadUrl
                                 }
                             }
                         }
                     }
                 }
             }
         }
     }
 }

我只是不确定这是否是最好的方法。


推荐阅读