Skip to main content

Introdução à API REST

Aprenda a usar a API REST do GitHub.

Introdução

Este artigo descreve como usar a API REST do GitHub com GitHub CLI, curl ou JavaScript. Para ver um guia de início rápido, confira Início Rápido para a API REST do GitHub.

Sobre solicitações para a API REST

Esta seção descreve os elementos que compõem uma solicitação de API:

Cada solicitação para a API REST inclui um método HTTP e um caminho. Dependendo do ponto de extremidade da API REST, talvez você também precise especificar cabeçalhos de solicitação, informações de autenticação, parâmetros de consulta ou parâmetros de corpo.

A documentação de referência da API REST descreve o método HTTP, o caminho e os parâmetros para cada ponto de extremidade. Ela também exibe exemplos de solicitações e respostas para cada ponto de extremidade. Para mais informações, confira a documentação de referência de REST.

Método HTTP

O método HTTP de um ponto de extremidade define o tipo de ação que ele executa em um determinado recurso. Alguns métodos HTTP comuns são GET, POST, DELETE e PATCH. A documentação de referência da API REST fornece o método HTTP para cada ponto de extremidade.

Por exemplo, o método HTTP para o ponto de extremidade "Listar problemas do repositório" é GET.

Sempre que possível, a API REST do GitHub tenta usar um método HTTP apropriado para cada ação.

  • GET: usado para recuperar recursos.
  • POST: usado para criar recursos.
  • PATCH: usado para atualizar propriedades de recursos.
  • PUT: usado para substituir recursos ou coleções de recursos.
  • DELETE: usado para excluir recursos.

Caminho

Cada ponto de extremidade tem um caminho. A documentação de referência da API REST fornece o caminho para cada ponto de extremidade. Por exemplo, o caminho para o ponto de extremidade "Listar problemas do repositório" é /repos/{owner}/{repo}/issues.

As chaves {} em um caminho denotam os parâmetros de caminho que precisam ser especificados por você. Os parâmetros de caminho modificam o caminho do ponto de extremidade e são necessários em sua solicitação. Por exemplo, os parâmetros de caminho para o ponto de extremidade "Listar problemas do repositório" são {owner} e {repo}. Para usar esse caminho em sua solicitação de API, substitua {repo} pelo nome do repositório no qual você deseja solicitar uma lista de problemas e substitua {owner} pelo nome da conta proprietária do repositório.

Cabeçalhos

Os cabeçalhos fornecem informações adicionais sobre a solicitação e a resposta desejada. Veja a seguir alguns exemplos de cabeçalhos que você pode usar em suas solicitações para a API REST do GitHub. Para obter um exemplo de uma solicitação que usa cabeçalhos, consulte Fazer uma solicitação.

Accept

A maioria dos pontos de extremidade da API REST do GitHub especifica que você deve transmitir um cabeçalho Accept com um valor de application/vnd.github+json. O valor do cabeçalho Accept é um tipo de mídia. Para obter mais informações sobre os tipos de mídia, confira Tipos de mídia.

X-GitHub-Api-Version

Você deve usar esse cabeçalho para especificar uma versão da API REST a ser usada para sua solicitação. Para saber mais, confira Versões da API.

User-Agent

Todas as solicitações de API precisam incluir um cabeçalho User-Agent válido. O cabeçalho User-Agent identifica o usuário ou aplicativo que está fazendo a solicitação.

Se você usar o SDK Octokit.js, o SDK enviará um cabeçalho User-Agent válido para você. No entanto, o GitHub recomenda usar o nome de usuário do GitHub ou o nome do aplicativo para o valor do cabeçalho User-Agent. Isso permite que GitHub entre em contato com você se houver problemas.

Veja a seguir um exemplo de User-Agent para um aplicativo chamado Awesome-Octocat-App:

User-Agent: Awesome-Octocat-App

Solicitações sem cabeçalho User-Agent serão rejeitadas. Se você fornecer um cabeçalho User-Agent inválido, receberá uma resposta 403 Forbidden.

Tipos de mídia

Você pode especificar um ou mais tipos de mídia adicionando-os ao cabeçalho Accept de sua solicitação. Para obter mais informações sobre o cabeçalho Accept, confira Accept.

Os tipos de mídia especificam o formato dos dados que você deseja consumir da API. Os tipos de mídia são específicos aos recursos, permitindo que eles mudem de forma independente e ofereçam suporte a formatos que outros recursos não. A documentação de cada ponto de extremidade da API REST do GitHub descreverá os tipos de mídia compatíveis. Para obter mais informações, confira Documentação da API REST do GitHub.

Os tipos de mídia mais comuns compatíveis com a API REST do GitHub são application/vnd.github+json e application/json.

Existem tipos de mídia personalizados que você pode usar com alguns pontos de extremidade. A API REST, por exemplo, para gerenciar commits e pull requests, oferece suporte aos tipos de mídia diff, patch e sha. Os tipos de mídia full, raw, text ou html são usados por alguns outros pontos de extremidade.

Todos os tipos de mídias personalizadas no GitHub são semelhantes ao seguinte: application/vnd.github.PARAM+json, em que PARAM é o nome do tipo de mídia. Por exemplo, para especificar o tipo de mídia raw, você poderia usar application/vnd.github.raw+json.

Para obter um exemplo de uma solicitação que usa tipos de mídia, confira Fazer uma solicitação.

Autenticação

Muitos pontos de extremidade exigem autenticação ou retornam informações adicionais se você estiver autenticado. Além disso, você pode fazer mais solicitações por hora quando estiver autenticado.

Para autenticar sua solicitação, você precisará fornecer um token de autenticação com os escopos ou as permissões necessários. Existem algumas maneiras diferentes de obter um token: você pode criar um personal access token, gerar um token com um GitHub App ou usar o GITHUB_TOKEN interno em um fluxo de trabalho do GitHub Actions. Para saber mais, confira Autenticação na API REST.

Para obter um exemplo de uma solicitação que usa um token de autenticação, confira Fazer uma solicitação.

Warning

Trate seu token de acesso da mesma forma que trataria suas senhas ou outras credenciais confidenciais. Para saber mais, confira Manter suas credenciais de API seguras.

Parâmetros

Muitos métodos de API exigem ou permitem que você envie informações adicionais em parâmetros em sua solicitação. Existem alguns tipos diferentes de parâmetros: parâmetros de caminho, parâmetros de corpo e parâmetros de consulta.

Parâmetros de caminho

Os parâmetros de caminho modificam o caminho do ponto de extremidade. Esses parâmetros são obrigatórios em sua solicitação. Para obter mais informações, consulte Caminho.

Parâmetros do corpo

Os parâmetros do corpo permitem que você passe dados adicionais para a API. Esses parâmetros podem ser opcionais ou obrigatórios, dependendo do ponto de extremidade. Por exemplo, um parâmetro de corpo pode permitir que você especifique um título de problema ao criar um novo problema ou especificar determinadas configurações ao habilitar ou desabilitar um recurso. A documentação de cada ponto de extremidade da API REST do GitHub descreverá os tipos de corpo compatíveis. Para obter mais informações, confira Documentação da API REST do GitHub.

Por exemplo, o ponto de extremidade "Criar um problema" exige que você especifique um título para o novo problema em sua solicitação. Ele também permite que você especifique outras informações opcionalmente, como texto para colocar no corpo do problema, usuários para atribuir ao novo problema ou rótulos para aplicar ao novo problema. Para obter um exemplo de uma solicitação que usa parâmetros de corpo, confira Fazer uma solicitação.

Para transmitir parâmetros de corpo, você deverá autenticar sua solicitação. Para obter mais informações, confira Autenticação.

Parâmetros de consulta

Os parâmetros de consulta permitem controlar quais dados são retornados para uma solicitação. Geralmente, esses parâmetros são opcionais. A documentação de cada ponto de extremidade da API REST do GitHub descreverá quaisquer parâmetros de consulta compatíveis. Para obter mais informações, confira Documentação da API REST do GitHub.

Por exemplo, o ponto de extremidade "Listar eventos públicos" retorna trinta problemas por padrão. Você pode usar o parâmetro de consulta per_page para retornar dois problemas em vez de 30. Você pode usar o parâmetro de consulta page para buscar apenas a primeira página de resultados. Para obter um exemplo de uma solicitação que usa parâmetros de consulta, consulte Fazer uma solicitação.

Como fazer uma solicitação

Esta seção demonstra como fazer uma solicitação para a API REST do GitHub usando JavaScript e Octokit.js. Para ver um guia mais detalhado, confira Scripts com a API REST e o JavaScript.

1. Instalação

Você deve instalar o octokit para usar a biblioteca Octokit.js apresentada nos exemplos a seguir.

  • Instale o octokit. Por exemplo, npm install octokit. Para outras maneiras de instalar ou carregar octokit, confira o LEIA-ME do Octokit.js.

2. Escolher um ponto de extremidade para sua solicitação

  1. Escolha um ponto de extremidade para o qual fazer uma solicitação. É possível consultar a documentação da API REST do GitHub para descobrir pontos de extremidades que possam ser usados para interagir com o GitHub.

  2. Identifique o método HTTP e o caminho do ponto de extremidade. Você vai enviá-los com sua solicitação. Para obter mais informações, consulte Método HTTP e Caminho.

    Por exemplo, o ponto de extremidade "Criar um problema" usa o método HTTP POST e o caminho /repos/{owner}/{repo}/issues.

  3. Identifique os parâmetros de caminho necessários. Os parâmetros de caminho necessários aparecem entre colchetes {} no caminho do ponto de extremidade. Substitua cada espaço reservado do parâmetro pelo valor desejado. Para obter mais informações, consulte Caminho.

    Por exemplo, o ponto de extremidade "Criar um problema" usa o caminho /repos/{owner}/{repo}/issues e os parâmetros de caminho são {owner} e {repo}. Para usar esse caminho em sua solicitação de API, substitua {repo} pelo nome do repositório no qual deseja criar um novo problema e substitua {owner} pelo nome da conta proprietária do repositório.

3. Criar um token de acesso

Crie um token de acesso para autenticar sua solicitação. Você pode salvar seu token e usá-lo para várias solicitações. Atribua ao token todos os escopos ou permissões necessários para acessar o ponto de extremidade. Você enviará esse token em um cabeçalho Authorization com sua solicitação. Para obter mais informações, confira Autenticação.

4. Fazer uma solicitação com Octokit.js

  1. Importe octokit em seu script. Por exemplo, import { Octokit } from "octokit";. Para outras maneiras de importar octokit, confira o LEIA-ME do Octokit.js.

  2. Crie uma instância de Octokit com seu token. Substitua YOUR-TOKEN pelo seu token.

    JavaScript
    const octokit = new Octokit({ 
      auth: 'YOUR-TOKEN'
    });
    
  3. Use octokit.request para executar sua solicitação.

    • Envie o método HTTP e o caminho como o primeiro argumento do método request. Para obter mais informações, consulte Método HTTP e Caminho.
    • Especifique todos os parâmetros de caminho, consulta e corpo em um objeto como o segundo argumento do método request. Para obter mais informações, confira Parâmetros.

    No exemplo de solicitação a seguir, o método HTTP é POST, o caminho é /repos/{owner}/{repo}/issues, os parâmetros de caminho são owner: "octocat" e repo: "Spoon-Knife" e os parâmetros de corpo são title: "Created with the REST API" e body: "This is a test issue created by the REST API".

    Note

    Se estiver usando um fine-grained personal access token, substitua octocat/Spoon-Knife por um repositório que pertença a você ou a uma organização da qual seja membro. O token precisa ter acesso a esse repositório e ter permissões de leitura e gravação para problemas de repositório. Para saber mais, confira Gerenciar seus tokens de acesso pessoal.

    JavaScript
    await octokit.request("POST /repos/{owner}/{repo}/issues", {
      owner: "octocat",
      repo: "Spoon-Knife",
      title: "Created with the REST API",
      body: "This is a test issue created by the REST API",
    });
    

    O método request passa automaticamente o cabeçalho Accept: application/vnd.github+json. Para passar cabeçalhos adicionais ou um cabeçalho Accept diferente, adicione uma propriedade headers ao objeto que é passado como o segundo argumento. O valor da propriedade headers é um objeto com os nomes de cabeçalho como chaves e valores de cabeçalho como valores.

    Por exemplo, o código a seguir enviará um cabeçalho content-type com o valor text/plain e um cabeçalho X-GitHub-Api-Version com o valor de 2022-11-28.

    JavaScript
    await octokit.request("GET /octocat", {
      headers: {
        "content-type": "text/plain",
        "X-GitHub-Api-Version": "2022-11-28",
      },
    });
    

Como usar a resposta

Depois que você fizer uma solicitação, a API retornará o código de status de resposta, os cabeçalhos de resposta e, possivelmente, um corpo da resposta.

Sobre o código de resposta e os cabeçalhos

Toda solicitação retornará um código de status HTTP que indica o sucesso da resposta. Para obter mais informações sobre códigos de resposta, confira a documentação do código de status de resposta HTTP do MDN.

Além disso, a resposta incluirá cabeçalhos que fornecem mais detalhes sobre a resposta. Cabeçalhos que começam com X- ou x- são personalizados para GitHub. Por exemplo, os cabeçalhos x-ratelimit-remaining e x-ratelimit-reset informam quantas solicitações você pode fazer em um período.

Quando você faz uma solicitação com Octokit.js, o método request retorna uma promessa. Se a solicitação tiver sido bem-sucedida, a promessa será resolvida para um objeto que inclui o código de status HTTP da resposta (status) e os cabeçalhos de resposta (headers). Se ocorrer um erro, a promessa será resolvida para um objeto que inclui o código de status HTTP da resposta (status) e os cabeçalhos de resposta (response.headers).

Você pode usar um bloco try/catch para capturar eventuais erros que ocorrerem. Por exemplo, se a solicitação no script a seguir for bem-sucedida, o script vai registrar o código de status e o valor do cabeçalho x-ratelimit-remaining. Se a solicitação não tiver sido bem-sucedida, o script vai registrar o código de status, o valor do cabeçalho x-ratelimit-remaining e a mensagem de erro.

No exemplo a seguir, substitua REPO-OWNER pelo nome da conta proprietária do repositório e REPO-NAME pelo nome do repositório.

JavaScript
try {
  const result = await octokit.request("GET /repos/{owner}/{repo}/issues", {
    owner: "REPO-OWNER",
    repo: "REPO-NAME",
    per_page: 2,
  });

  console.log(`Success! Status: ${result.status}. Rate limit remaining: ${result.headers["x-ratelimit-remaining"]}`)

} catch (error) {
  console.log(`Error! Status: ${error.status}. Rate limit remaining: ${error.headers["x-ratelimit-remaining"]}. Message: ${error.response.data.message}`)
}

Sobre o corpo da resposta

Muitos pontos de extremidade devolverão um corpo da resposta. A menos que especificado de outra forma, o corpo da resposta está no formato JSON. Os campos em branco são incluídos como null em vez de serem omitidos. Todos os carimbo de data/hora são devolvidos no formato UTC, ISO 8601: YYYY-MM-DDTHH:MM:SSZ.

Ao contrário da API do GraphQL, onde você especifica quais informações quer, a API REST normalmente retorna mais informações do que você precisa. Se desejar, você pode analisar a resposta a fim de extrair informações específicas.

Por exemplo, você pode obter o título e a ID do autor de cada problema. No exemplo a seguir, substitua REPO-OWNER pelo nome da conta proprietária do repositório e REPO-NAME pelo nome do repositório.

JavaScript
try {
  const result = await octokit.request("GET /repos/{owner}/{repo}/issues", {
    owner: "REPO-OWNER",
    repo: "REPO-NAME",
    per_page: 2,
  });

  const titleAndAuthor = result.data.map(issue => {title: issue.title, authorID: issue.user.id})

  console.log(titleAndAuthor)

} catch (error) {
  console.log(`Error! Status: ${error.status}. Message: ${error.response.data.message}`)
}

Declarações detalhadas vs. resumidas

Uma resposta pode incluir todos os atributos de um recurso ou apenas um subconjunto de atributos, dependendo de você efetuar fetch de um recurso individual ou de uma lista de recursos.

  • Quando você efetuar fetch de um recurso individual, como um repositório específico, a resposta normalmente incluirá todos os atributos desse recurso. Esta é a representação "detalhada" do recurso.
  • Quando você efetuar fetch de uma lista de recursos, como uma lista de vários repositórios, a resposta incluirá apenas um subconjunto dos atributos para cada recurso. Esta é a representação "resumo" do recurso.

Observe que às vezes a autorização influencia a quantidade de detalhes incluídos em uma declaração.

A razão para isso é que alguns atributos são computacionalmente caros para a API fornecer, portanto, o GitHub exclui esses atributos da declaração resumida. Para obter esses atributos, você pode efetuar fetch da declaração detalhada.

A documentação fornece um exemplo de resposta para cada método da API. A resposta de exemplo ilustra todos os atributos que retornados por esse método.

Hipermídia

Todos os recursos podem ter uma ou mais propriedades *_url vinculando outros recursos. Estes tem o objetivo de fornecer URLs explícitas para que os clientes API apropriados não precisem construir URLs por conta própria. É altamente recomendável que os clientes da API os utilizem. Fazer isso tornará as futuras atualizações da API mais fáceis para os desenvolvedores. Espera-se que todas as URLs sejam modelos de URI RFC 6570 adequados.

Em seguida, você pode expandir esses modelos usando algo como ogem uri_template:

>> tmpl = URITemplate.new('/notifications{?since,all,participating}')
>> tmpl.expand
=> "/notifications"

>> tmpl.expand all: 1
=> "/notifications?all=1"

>> tmpl.expand all: 1, participating: 1
=> "/notifications?all=1&participating=1"

Próximas etapas

Este artigo demonstrou como listar e criar problemas em um repositório. Para obter mais práticas, tente comentar um problema, editar o título de um problema ou fechar um problema. Para obter mais informações, consulte o ponto de extremidade "Criar um comentário sobre o problema" e o ponto de extremidade "Atualizar um problema".

Para obter mais informações sobre outros pontos de extremidade que você pode usar, confira a documentação de referência de REST.