Compartilhar via


Tratamento de erros em solicitações de API do Microsoft Graph com Invoke-RestMethod

Este artigo fornece um exemplo de código que demonstra como lidar com erros e implementar a lógica de repetição ao fazer solicitações para a API do Microsoft Graph usando o Invoke-RestMethod cmdlet no PowerShell.

Pré-requisitos

  • Um registro de aplicativo do Azure com um segredo do cliente
  • A user.read.all permissão para Microsoft.Graph para o aplicativo do Azure. Para obter mais informações, consulte Listar usuários.

Exemplo de código

Para demonstrar a lógica de repetição, este exemplo tenta consultar os signInActivity dados de usuários convidados. Ao executar esse código, você pode esperar receber um erro "403".

  • Get-AccessTokenCC Essa função solicita um token de acesso da ID do Microsoft Entra (antigo Azure Active Directory). O token será usado para autenticar solicitações de API para o Microsoft Graph. Você precisa fornecer valores para as $clientSecretvariáveis , $clientIde $tenantId do seu aplicativo de registro do Azure.
  • Get-GraphQueryOutput ($Uri) Essa função faz uma solicitação à API do Microsoft Graph para recuperar dados. Ele também lida com paginação. A função repete a solicitação se um erro "403" for gerado.
Function Get-AccessTokenCC
 
{
    $clientSecret = ''
    $clientId = ''
    $tenantId = ''
    # Construct URI
    $uri = "https://login.microsoftonline.com/$tenantId/oauth2/v2.0/token"
    # Construct Body
    $body = @{
        client_id = $clientId
        client_secret = $clientSecret
        scope = 'https://graph.microsoft.com/.default'
        grant_type = 'client_credentials'
    }
    # Get OAuth 2.0 Token
    $tokenRequest = Invoke-WebRequest -Method Post -Uri $uri -ContentType 'application/x-www-form-urlencoded' -Body $body -UseBasicParsing
    # Access Token
    $token = ($tokenRequest.Content | ConvertFrom-Json).access_token
    #$token = "Junk"  #uncomment this line to cause a 401 error -- you can set that status in the error handler to test the pause and retry
    #Write-Host "access_token = $token"
    return $token
}
 
Function Get-GraphQueryOutput ($Uri)
{
    write-host "uri = $Uri"
    write-host "token = $token"

    $retryCount = 0
    $maxRetries = 3
    $pauseDuration = 2
 
    $allRecords = @()
    while ($Uri -ne $null){
        Write-Host $Uri
        try {
            # todo: verify that the bearer token is still good -- hasn't expired yet -- if it has, then get a new token before making the request
            $result=Invoke-RestMethod -Method Get -Uri $Uri -ContentType 'application/json' -Headers @{Authorization = "Bearer $token"}
           
            Write-Host $result
         
            if($query.'@odata.nextLink'){
                # set the url to get the next page of records. For more information about paging, see https://docs.microsoft.com/graph/paging
                $Uri = $query.'@odata.nextLink'
            } else {
                $Uri = $null
            }
 
        } catch {
            Write-Host "StatusCode: " $_.Exception.Response.StatusCode.value__
            Write-Host "StatusDescription:" $_.Exception.Response.StatusDescription
 
            if($_.ErrorDetails.Message){
                Write-Host "Inner Error: $_.ErrorDetails.Message"
            }
 
            # check for a specific error so that we can retry the request otherwise, set the url to null so that we fall out of the loop
            if($_.Exception.Response.StatusCode.value__ -eq 403 ){
                # just ignore, leave the url the same to retry but pause first
                if($retryCount -ge $maxRetries){
                    # not going to retry again
                    $Uri = $null
                    Write-Host 'Not going to retry...'
                } else {
                    $retryCount += 1
                    Write-Host "Retry attempt $retryCount after a $pauseDuration second pause..."
                    Start-Sleep -Seconds $pauseDuration
                }
 
            } else {
                # not going to retry -- set the url to null to fall back out of the while loop
                $Uri = $null
            }
        }
    }
 
    $output = $allRecords | ConvertTo-Json

if ($result.PSObject.Properties.Name -contains "value") {
    return $result.value
} else {
    return $result
}
}
 
# Graph API URIs
$uri = 'https://graph.microsoft.com/v1.0/users?$filter=userType eq ''Guest''&$select=displayName,UserprincipalName,userType,identities,signInActivity'

# Pull Data
$token = Get-AccessTokenCC
Get-GraphQueryOutput -Uri $uri|out-file c:\\temp\\output.json

Capturando um cabeçalho específico

Para cenários avançados, como capturar valores de cabeçalho específicos, como Retry-After durante a limitação de respostas (HTTP 429), use:

$retryAfterValue = $_.Exception.Response.Headers["Retry-After"]

Para lidar com o erro "429 - muitas solicitações", consulte Diretrizes de limitação do Microsoft Graph.

Entre em contato conosco para obter ajuda

Se você tiver dúvidas ou precisar de ajuda, crie uma solicitação de suporte ou peça ajuda à comunidade de suporte do Azure. Você também pode enviar comentários sobre o produto para a comunidade de comentários do Azure.