Usando a API list-issues-for-a-repository do GitHub

9

Quando você acessa o GitHub, em Problemas, ele exibe todos os problemas abertos como uma página HTML. Gostaríamos de implementar um painel mostrando todos os problemas em um repositório, agrupados por rótulos, incluindo aqueles que não estão corretamente rotulados.

Esta é a API de lista de problemas-para-um-repositório correspondente .

Enquanto eu estava inicialmente usando jQuery e Javascript, agora estou usando o PHP como prova de conceito, porque seu tratamento de sessão interno me permite usar a mesma página para efetuar login, autenticar e retornar o GitHub e continuar. Mas isso não importa para mim, qualquer idioma está bem.

Eu consegui acessar a API do GitHub via OAUTH2, mas quando recebo a lista de repositórios via https://api.github.com/orgs/{org}/reposela aparece como uma matriz vazia.

Como a /orgs/{org}/reposAPI retorna uma matriz vazia, é claro que a /repos/{org}/{repo}/issuesAPI correspondente retornará um erro.

Edit : Veja este acompanhamento para uma solução! Ainda bem que finalmente consegui!

Yimin Rong
fonte

Respostas:

7

É uma API de descanso. Você precisa chamar alguns pontos de extremidade usando uma solicitação Http. Não sei qual idioma você está tentando usar, por isso não posso dar um bom exemplo de como conseguir isso. Se você ainda não sabe qual idioma usar, use o postman para criar a chamada da API REST para a API do github.

Digamos que você deseja recuperar os problemas do repositório datilografado da microsoft , você precisaria chamar este ponto de extremidade da API:

https://api.github.com/repos/microsoft/typescript/issues

Observe aqui que substituí o :ownere o :repovalor da documentação pela que estou tentando obter.

Você pode passar alguns parâmetros para a chamada para filtrar seus dados, por exemplo, o rótulo da API.

https://api.github.com/repos/microsoft/typescript/issues?labels=API

Isso retornará apenas problemas rotulados como API.

Este é o básico de como usar uma API.

Nicolas
fonte
Obrigado. Isso me levou a meio caminho até lá. Isso está me dizendo { "message": "Not Found", "documentation_url": "https://developer.github.com/v3/issues/#list-issues-for-a-repository" }, mas eu li e essa parece ser a resposta padrão ao tentar acessar repositórios particulares, pesquisando sobre OAuth etc. FWIW, usando JavaScript na estrutura do jQuery.
Yimin Rong
Provavelmente existe, mas neste momento, não posso ensinar como o outh funciona. Há muitos tutoriais online. Devo dizer que não leve a mal, mas esse é um projeto muito grande para alguém com seu conhecimento de APIs. Eu só quero ter certeza de que você sabe o que está entrando @YiminRong
Nicolas #
Obrigado. Eu fiz o OAUTH2 funcionar, mas ele não está retornando as informações esperadas. Por favor, veja editar na edição.
Yimin Rong
4

Você pode usar o jQuery Ajax para acessar a API do Github e adicionar um cabeçalho de autenticação básico para autenticação (veja aqui ); um exemplo é mostrado abaixo; isso resolverá os problemas de um determinado repositório e mostrará os 10 primeiros em uma janela de alerta.

Consulte a documentação sobre problemas de extração aqui: https://developer.github.com/v3/issues/ para ver quais parâmetros você pode usar para filtrar, classificar etc.

Por exemplo, você pode obter todos os problemas rotulados como 'bug' usando:

/issues?labels=bug

Isso pode incluir vários rótulos, por exemplo

/issues?labels=enhancement,nicetohave

Você pode modificar facilmente para listar em uma tabela etc.

const username = 'github_username'; // Set your username here
const password = 'github_password'; // Set your password here
const repoPath = "organization/repo" // Set your Repo path e.g. microsoft/typescript here

$(document).ready(function() {
    $.ajax({
        url: `https://api.github.com/repos/${repoPath}/issues`,
        type: "GET",
        crossDomain: true,
        // Send basic authentication header.
        beforeSend: function (xhr) {
            xhr.setRequestHeader ("Authorization", "Basic " + btoa(username + ":" + password));
        },
        success: function (response) {
            console.log("Response:", response);
            alert(`${repoPath} issue list (first 10):\n - ` + response.slice(0,10).map(issue => issue.title).join("\n - "))
        },
        error: function (xhr, status) {
            alert("error: " + JSON.stringify(xhr));
        }
    });
});

Abaixo está um trecho da lista de problemas para um repo (público) usando jQuery e a API do Github:

(Observe que não adicionamos um cabeçalho de autenticação aqui!)

const repoPath = "leachim6/hello-world" // 

$(document).ready(function() {
$.ajax({
    url: `https://api.github.com/repos/${repoPath}/issues`,
    type: "GET",
    crossDomain: true,
    success: function (response) {
        tbody = "";
        response.forEach(issue => {
            tbody += `<tr><td>${issue.number}</td><td>${issue.title}</td><td>${issue.created_at}</td><td>${issue.state}</td></tr>`;
        });
        $('#output-element').html(tbody);
    },
    error: function (xhr, status) {
        alert("error: " + JSON.stringify(xhr));
    }
});
});
<head>
<meta charset="utf-8">
<title>Issue Example</title>
<link rel="stylesheet" href="css/styles.css?v=1.0">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.4.1.min.js" crossorigin="anonymous"></script>
</head>
<body style="margin:50px;padding:25px">
<h3>Issues in Repo</h3>
<table class="table table-striped">
    <thead>
      <tr>
        <th scope="col">Issue #</th>
        <th scope="col">Title</th>
        <th scope="col">Created</th>
        <th scope="col">State</th>
      </tr>
    </thead>
    <tbody id="output-element">
    </tbody>
</table>
</body>

Terry Lennox
fonte
Obrigado. Vou olhar para isso o mais rápido possível. Eu não estou recebendo os resultados esperados usando OAUTH2, e notei uma API https://api.github.com/authorizationsindicou que poderia ser acessada somente com autorização básica: stdClass Object ( [message] => This API can only be accessed with username and password Basic Auth [documentation_url] => https://developer.github.com/v3 ). Então, talvez isso funcione.
Yimin Rong
A autenticação básica funciona para mim, usando minhas credenciais do github. Se você deseja acessar um repositório público, pode comentar a seção beforeSend!
Terry Lennox