Olá pessoal,
É muito comum quanto estamos consultando APIs que elas utilizem uma funcionalidade chamada paginamento. Isso permite que a API responda de forma mais rapida e otimize o tempo de processamento do serviço onde os retornos seriam muito maiores e levariam muito mais tempo que o esperado.
Para esse exemplo vou utilizar a API do Rick and Morty, acessivel em https://rickandmortyapi.com/api, e vamos consultar a lista de personagens.
Para consultar a API essa API é muito simples, basta utilizarmos o comando Invoke-RestMethod
, e informar a URI, e como vamos fazer uma consulta, o método GET é o que itemos utilizar
$rickandmortyapi = @{
Uri = 'https://rickandmortyapi.com/api/character'
Method = 'GET'
}
Invoke-RestMethod @rickandmortyapi
Temos duas propriedades nesse retorno, info e results. Em results como o proprio nome ja diz temos os resultados que consistem de 20 items ou personagens no nosso exemplo. Em info podemos ver quantos personagens temos no total e quantas paginas no total devemos consultar para obter todos os resultados, e por fim temos next, que seria a URI da proxima pagina. Essa API faz agrupamentos de 20 personagens por pagina, então para 826 personagens no total, teremos 42 paginas.
Para consultar todas as paginas em sequencia, seria necessário criar um laço de repetição para continuarmos consultando os valores até a ultima pagina e armazenar os resultados em uma lista. Vamos primeiro criar a lista para armazenar os resultados declarando um novo objeto do tipo ArrayList:
$Personagens = New-Object -TypeName 'System.Collections.ArrayList'
Agora precisamos armazenar os resultados da ultima chamada na lista, porem como a arraylist exibe o numero com a posição que foi criada nela, vamos utilizar o metodo void para sumirmir o resultado:
@($chamada.results).ForEach({
[void]$Personagens.Add($PSItem)
})
$chamada.results | ForEach-Object -Process {
[void]$Personagens.Add($PSItem)
}
for($i = 2; $i -le $chamada.info.pages; $i++)
{
Write-Output -InputObject "Processando pagina $i de $($chamada.info.pages)"
$chamada = Invoke-RestMethod -Method 'GET' -Uri $chamada.info.next
@($chamada.results).ForEach({
[void]$Personagens.Add($PSItem)
})
}
Caso queira, pode adicionar uma condição if para evitar que entre no laço no caso de nao ter mais de 1 pagina. Por fim podemos agrupar isso em um script e ter o retorno de todos os personagens adicionados a nossa lista.
Script completo:
$Personagens = New-Object -TypeName 'System.Collections.ArrayList'
$rickandmortyapi = @{
Uri = 'https://rickandmortyapi.com/api/character'
Method = 'GET'
}
$chamada = Invoke-RestMethod @rickandmortyapi
@($chamada.results).ForEach({
[void]$Personagens.Add($PSItem)
})
if($chamada.info.pages -gt 1){
Write-Output -InputObject "Retorno da API tem mais de 1 pagina"
for($i = 2; $i -le $chamada.info.pages; $i++)
{
Write-Output -InputObject "Processando pagina $i de $($chamada.info.pages)"
$chamada = Invoke-RestMethod -Method 'GET' -Uri $chamada.info.next
@($chamada.results).ForEach({
[void]$Personagens.Add($PSItem)
})
}
}
A partir deste ponto voce poderá consultar todos os resultados a partir de um unico local e trata-los da forma que seu caso de uso exigir.
Dúvidas? Sugestões? Comente!
Até a próxima!