问题
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
datais nullresponseData.GetType().Namesays theresponseDatais 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