Читайте образ из частного репозитория GitHub прагматично, используя C # - PullRequest
0 голосов
/ 21 октября 2019

Необходимо сохранить изображение из частного git-репозитория в большой двоичный объект, используя C #. Пробовал с кодом ниже, но получаю 404 ошибки.

Я использую приведенный ниже код из C # пример загрузки частного репозитория GitHub программным способом

var githubToken = "[token]";
var url = 
"https://github.com/[username]/[repository]/archive/[sha1|tag].zip";
var path = @"[local path]";

using (var client = new System.Net.Http.HttpClient())
{
var credentials = string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0}:", githubToken);
credentials = Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes(credentials));
client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", credentials);
var contents = client.GetByteArrayAsync(url).Result;
System.IO.File.WriteAllBytes(path, contents);
}

Примечание. Возможность извлечения из открытого репозитория

Ответы [ 2 ]

1 голос
/ 22 октября 2019

Как исправить:

  1. URL-адрес изменен на GET /repos/:owner/:repo/:archive_format/:ref. См. https://developer.github.com/v3/repos/contents/#get-archive-link

    Для частных репозиториев эти ссылки являются временными и истекают через пять минут.

    GET / repos /: owner /: repo /: archive_format /: ref

  2. Вы не должны передавать учетные данные с помощью обычной аутентификации. Вместо этого вы должны создать токен , следуя официальным документам. см. https://help.github.com/en/github/authenticating-to-github/creating-a-personal-access-token-for-the-command-line

  3. Наконец, вам нужно передать дополнительный заголовок User-Agent. Это требуется GitHub API. См. https://developer.github.com/v3/#user-agent-required:

    Все запросы API ДОЛЖНЫ содержать действительный заголовок User-Agent.

Демо

public class GitHubRepoApi{

    public string EndPoint {get;} = "https://api.github.com/repos";

    public async Task DownloadArchieveAsync(string saveAs, string owner, string token, string repo,string @ref="master",string format="zipball")
    {
        var url = this.GetArchieveUrl(owner, repo, @ref, format);
        var req = this.BuildRequestMessage(url,token);
        using( var httpClient = new HttpClient()){
            var resp = await httpClient.SendAsync(req);
            if(resp.StatusCode != System.Net.HttpStatusCode.OK){
                throw new Exception($"error happens when downloading the {req.RequestUri}, statusCode={resp.StatusCode}");
            }
            using(var fs = File.OpenWrite(saveAs) ){
                await resp.Content.CopyToAsync(fs);
            }
        }
    }
    private string GetArchieveUrl(string owner, string repo, string @ref = "master", string format="zipball")
    {
        return $"{this.EndPoint}/{owner}/{repo}/{format}/{@ref}"; // See https://developer.github.com/v3/repos/contents/#get-archive-link
    }
    private HttpRequestMessage BuildRequestMessage(string url, string token)
    {
        var uriBuilder = new UriBuilder(url);
        uriBuilder.Query = $"access_token={token}";   // See https://help.github.com/en/github/authenticating-to-github/creating-a-personal-access-token-for-the-command-line
        var req = new HttpRequestMessage();
        req.RequestUri = uriBuilder.Uri;
        req.Headers.Add("User-Agent","My C# Client"); // required, See https://developer.github.com/v3/#user-agent-required
        return req;
    }
}

Тест:

var api = new GitHubRepoApi();
var saveAs= Path.Combine(Directory.GetCurrentDirectory(),"abc.zip");
var owner = "newbienewbie";
var token = "------your-----token--------";
var repo = "your-repo";
var @ref = "6883a92222759d574a724b5b8952bc475f580fe0"; // will be "master" by default
api.DownloadArchieveAsync(saveAs, owner,token,repo,@ref).Wait();
1 голос
/ 22 октября 2019

Согласно сообщению, которое вы предоставляете, вы используете неверный URL для загрузки. Относительно того, как получить URL-адрес для загрузки, выполните следующие действия:

  1. Используйте следующий URL-адрес, чтобы получить URL-адрес для загрузки
Method: GET
URL: https://api.github.com/repos/:owner/:repo/contents/:path?ref:<The name of the commit/branch/tag>
Header:
       Authorization: token <personal access token>

В теле сообщения будет сказаноВы URL загрузки Например: enter image description here

Загрузить файл enter image description here

Для получения более подробной информации, пожалуйста, обратитесь к https://developer.github.com/v3/repos/contents/#get-contents.

...