c# - 使用 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"
}
},
[...]
我也需要以某种方式将其放入查询中(只是一个示例,我也需要其他字段),将name
and 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();
如何使用标签名称搜索单个版本?
如何正确读取结果数据?
解决方案
我能够得到我想要的:
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
}
}
}
}
}
}
}
}
}
我只是不确定这是否是最好的方法。
推荐阅读
- ios - 我想在 ios(swift) 中每五分钟加载一次 facebook 插页式广告
- mysql - 如何在 Mysql+Node JS 的另一个查询中使用一个查询的结果数组?
- git - 如何在 git 中比较不同分支中的相同文件(使用 visualstudio 或 Tortoise git,或使用 Git UI)
- java - Object的Oracle PLSQL表有一个参数在Oracle 11g中填写,但在Oracle 12c中没有填写
- html - Bootstrap 3将行中的元素拉伸到相同大小
- ruby-on-rails - ActionMailer::Base:Class 的未定义方法 (NoMethodError)
- java - 如何检查 AWS SQS 连接空闲时间
- javascript - 如何在管道地图中处理承诺
- c++ - 如果用户重复订购,价格不会累积
- c++ - C++/Djinni 错误字段类型是一个抽象类