Paginación de request de API

Estoy haciendo una request simple de API a Github para get todos los repositorys. El problema es que Github tiene una limitación y el máximo que puede enviar es de 100 por request. Hay usuarios que tienen más de 100 repositorys y no sé cómo acceder a ellos o cómo hacer la pagination.

Estoy haciendo una request GET con Axios de esta manera:

https://api.github.com/users/<AccountName>/repos?per_page=100 

También puedo poner el número de página como tal

 https://api.github.com/users/<AccountName>/repos?page=3&per_page=100 

¿Pero cómo hago que esto funcione en la aplicación sin hacer 10 requestes de API? Ni siquiera sabría cuántas requestes debería hacer porque no sé cuál es el número que se devuelve, ¿alguien tiene 100 o 1000 repositorys? Me gustaría que todo se devuelva y guarde en matriz, por ejemplo.

EDITAR: Ejemplo: estoy pasando en accountName

 var config = { headers: {'Authorization': `token ${ACCESS_TOKEN}`} } const REQUEST: string = 'https://api.github.com/users/' const apiCall = { getData: async function (accountName) { const encodedAccountName = encodeURIComponent(accountName) const requestUrl = `${REQUEST}${encodedAccountName}` const user = await axios.get(requestUrl, config) // This return user and inside of user there is a link for fetching repos const repo = await axios.get(`${user.data.repos_url}?per_page=100`, config) ... 

Puede get el recuento de reposiciones solicitándolo primero desde la URL de la count del usuario. Por ejemplo, aquí es mío:

https://api.github.com/users/erikh2000

La respuesta allí incluye un valor de "public_repos". Bam! Ese es el número mágico que quieres.

A continuación, debe realizar varias recuperaciones si el recuento de repositorys es superior a 100. Sé que no quería hacerlo, pero bueno … no puede culpar a los web services por tratar de conservar su ancho de banda. La buena noticia es que probablemente pueda ponerlos en un bloque Promise.all () y hacer que todos se junten y regresen a la vez. Entonces código como …

 const fetchAllTheRepos = (userName, repoCount) => { const MAX_PER_PAGE = 100; const baseUrl = 'https://api.github.com/users/' + userName + '/repos?per_page=' + MAX_PER_PAGE; //Start fetching every page of repos. const fetchPromises = [], pageCount = Math.ceil(repoCount / MAX_PER_PAGE); for (let pageI = 1; pageI <= pageCount; ++pageI) { const fetchPagePromise = fetch(baseUrl + '&page=' + pageI); fetchPromises.push(fetchPagePromise); } //This promise resolves after all the fetching is done. return Promise.all(fetchPromises) .then((responses) => { //Parse all the responses to JSON. return Promise.all( responses.map((response) => response.json()) ); }).then((results) => { //Copy the results into one big array that has all the friggin repos. let repos = []; results.forEach((result) => { repos = repos.concat(result); }); return repos; }); }; //I left out the code to get the repo count, but that's pretty easy. fetchAllTheRepos('erikh2000', 7).then((repos) => { console.log(repos.length); }); 

La búsqueda simultánea de todas las páginas puede llegar a ser más de lo que Github quiere permitirte hacer de inmediato para aquellas counts con muchos repositorys. Me gustaría poner un límite de "buen ciudadano" sobre la cantidad de repos que tratará de get de una vez, por ejemplo, 1000. Y luego ver si api.github.com está de acuerdo con su definición de un buen ciudadano observando las respuestas de error HTTP. Puede get soluciones de estrangulamiento si es necesario, pero probablemente un enfoque de "agarrar todo de una vez" como el anterior funciona bien.

Por otro lado, si estás explorando varias counts en una session, entonces tal vez diseña la aceleración desde el principio solo para que sepas … se agradable. Para eso, mira un patrón queue / worker.