问题
I am using Octokit.net version 0.9.0
(GitHub API for .NET) for getting zip contents of few repositories.
I already have the list of repositories I need but I am having trouble with getting the the content of the repositories as .zip files (called zipball)
What I've tried so far
// ... client = new Client(...);
// some authentication logic...
// some other queries to GitHub that work correctly
var url = "https://api.github.com/repos/SomeUser/SomeRepo/zipball";
var response = await this.client.Connection.Get<byte[]>(
new Uri(url),
new Dictionary<string, string>(),
null);
var data = response.Body;
var responseData = response.HttpResponse.Body;
Problems with my attempts
data
is nullresponseData.GetType().Name
says theresponseData
is of type string- When I try
Encoding.ASCII.GetBytes(response.HttpResponse.Body.ToString());
I get invalid zip file
Quesion
What is the correct way to get zipballs of repositories after being authenticated using Octokit.net library?
I've also opened an issue in octokit.net repository.
回答1:
After checking the source of Octokit I think this is not possible (as of version 0.10.0):
See Octokit\Http\HttpClientAdapter.cs
// We added support for downloading images. Let's constrain this appropriately.
if (contentType == null || !contentType.StartsWith("image/"))
{
responseBody = await responseMessage.Content.ReadAsStringAsync().ConfigureAwait(false);
}
else
{
responseBody = await responseMessage.Content.ReadAsByteArrayAsync().ConfigureAwait(false);
}
The response body (responseData
) is converted to an unicode string and, thus, it's mangled and not binary the same. See my PR792 (need to replace the if statement with if (contentType == null || (!contentType.StartsWith("image/") && !contentType.StartsWith("application/")))
) to fix this (then it's a byte array. Writing possible using System.IO.File.WriteAllBytes("c:\\test.zip", (byte[])responseData);
).
来源:https://stackoverflow.com/questions/29766916/cannot-get-repository-contents-as-zip-file-zipball-in-octokit-net