来自 Github API 的意外 HTTP GET 响应
Unexpected HTTP GET Response from Github API
我目前正在尝试向我正在处理的应用程序添加一个简单的辅助更新功能,但是在发出 HTTP GET 请求时遇到了 Github API 的障碍。
我对 HTTP 协议没有太多经验,所以如果这背后的原因很明显,我深表歉意 - 我无法从其他问题中找到任何合适的答案,所以我们来了。
每当我从我的程序向 github API 发送 GET 请求时,它总是 returns 最新发布版本而不是 URL 中指定的版本.
我已经用许多不同的 URL 尝试过这个,所有这些都导致相同的令人沮丧的讽刺版本 4.0.4
(最新的完整版本) 被下载相反:
这是我用来发送请求的代码:
using HttpClient client = new();
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new("application/octet-stream"));
client.DefaultRequestHeaders.Add("User-Agent", "curl/7.64.1");
if (HttpDownloadFileAsync(client,
"https://api.github.com/repos/radj307/volume-control/releases/assets/65951248",
"VolumeControl.exe" //< replaced with hardcoded filename
).Wait(-1)) //< using infinite timeout in debug
{
// omitted for brevity
}
else
{
// omitted for brevity
}
client.Dispose();
这是 HttpDownloadFileAsync
函数,我从 this answer:
static async Task HttpDownloadFileAsync(HttpClient httpClient, string url, string fileToWriteTo)
{
using HttpResponseMessage response = await httpClient.GetAsync(url, HttpCompletionOption.ResponseHeadersRead);
using Stream streamToReadFrom = await response.Content.ReadAsStreamAsync();
using Stream streamToWriteTo = File.Open(fileToWriteTo, FileMode.Create);
await streamToReadFrom.CopyToAsync(streamToWriteTo);
}
总结:
我正在尝试使用 .NET Core 6 的 HttpClient
从 github 的 API 下载特定的预发布版本,无论我使用什么 URL,它总是返回相同的结果(不正确) 版本。
我已经检查了调试器和 firefox 以查看 URL 是否正确,它是 - API 似乎决定发回最新版本,无论我是否愿意。
为什么会发生这种情况,我可以做些什么来获得正确的版本?
在我看来,您正试图直接下载 API 数据,并将其另存为 .exe 文件。 URL 您传递给 HttpDownloadFileAsync returns JSON 数据,而不是 .exe
如果您访问您在浏览器中指定的 URL,您将看到 API 的 JSON 输出,其中有一个指定实际下载的元素 link 那个可执行文件。
https://api.github.com/repos/radj307/volume-control/releases/assets/65951248:
{
"url": "https://api.github.com/repos/radj307/volume-control/releases/assets/65951248",
"id": 65951248,
.. other data ..
"browser_download_url": "https://github.com/radj307/volume-control/releases/download/5.0.0-pr4.4/VolumeControl.exe"
}
请注意,此结果底部会显示“browser_download_url”。您可以将 HttpDownloadFileAsync 中的 url 替换为给定的 URL,或者如果您需要从 URL 中检索它,无论出于何种原因,您必须先下载 JSON 内容并检索该 browser_download_url 值,将其传递到 HttpDownloadFileAsync。
希望对您的问题有所帮助
我决定继续嵌入可执行文件,因为我无法让它工作,但不知何故修复了它。
当 运行 程序直接通过 Visual Studio 的调试器时,它被破坏了,现在它被调用 在调试器之外 它工作正常,没有任何变化。
因此,我责怪 MS。
我目前正在尝试向我正在处理的应用程序添加一个简单的辅助更新功能,但是在发出 HTTP GET 请求时遇到了 Github API 的障碍。
我对 HTTP 协议没有太多经验,所以如果这背后的原因很明显,我深表歉意 - 我无法从其他问题中找到任何合适的答案,所以我们来了。
每当我从我的程序向 github API 发送 GET 请求时,它总是 returns 最新发布版本而不是 URL 中指定的版本.
我已经用许多不同的 URL 尝试过这个,所有这些都导致相同的令人沮丧的讽刺版本 4.0.4
(最新的完整版本) 被下载相反:
这是我用来发送请求的代码:
using HttpClient client = new();
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new("application/octet-stream"));
client.DefaultRequestHeaders.Add("User-Agent", "curl/7.64.1");
if (HttpDownloadFileAsync(client,
"https://api.github.com/repos/radj307/volume-control/releases/assets/65951248",
"VolumeControl.exe" //< replaced with hardcoded filename
).Wait(-1)) //< using infinite timeout in debug
{
// omitted for brevity
}
else
{
// omitted for brevity
}
client.Dispose();
这是 HttpDownloadFileAsync
函数,我从 this answer:
static async Task HttpDownloadFileAsync(HttpClient httpClient, string url, string fileToWriteTo)
{
using HttpResponseMessage response = await httpClient.GetAsync(url, HttpCompletionOption.ResponseHeadersRead);
using Stream streamToReadFrom = await response.Content.ReadAsStreamAsync();
using Stream streamToWriteTo = File.Open(fileToWriteTo, FileMode.Create);
await streamToReadFrom.CopyToAsync(streamToWriteTo);
}
总结:
我正在尝试使用 .NET Core 6 的 HttpClient
从 github 的 API 下载特定的预发布版本,无论我使用什么 URL,它总是返回相同的结果(不正确) 版本。
我已经检查了调试器和 firefox 以查看 URL 是否正确,它是 - API 似乎决定发回最新版本,无论我是否愿意。
为什么会发生这种情况,我可以做些什么来获得正确的版本?
在我看来,您正试图直接下载 API 数据,并将其另存为 .exe 文件。 URL 您传递给 HttpDownloadFileAsync returns JSON 数据,而不是 .exe
如果您访问您在浏览器中指定的 URL,您将看到 API 的 JSON 输出,其中有一个指定实际下载的元素 link 那个可执行文件。
https://api.github.com/repos/radj307/volume-control/releases/assets/65951248:
{
"url": "https://api.github.com/repos/radj307/volume-control/releases/assets/65951248",
"id": 65951248,
.. other data ..
"browser_download_url": "https://github.com/radj307/volume-control/releases/download/5.0.0-pr4.4/VolumeControl.exe"
}
请注意,此结果底部会显示“browser_download_url”。您可以将 HttpDownloadFileAsync 中的 url 替换为给定的 URL,或者如果您需要从 URL 中检索它,无论出于何种原因,您必须先下载 JSON 内容并检索该 browser_download_url 值,将其传递到 HttpDownloadFileAsync。
希望对您的问题有所帮助
我决定继续嵌入可执行文件,因为我无法让它工作,但不知何故修复了它。
当 运行 程序直接通过 Visual Studio 的调试器时,它被破坏了,现在它被调用 在调试器之外 它工作正常,没有任何变化。
因此,我责怪 MS。