Ler em inglês

Compartilhar via


Padrão de esperar e tentar novamente

Em algumas situações, o comportamento de uma fonte de dados não corresponde ao esperado pelo tratamento de código HTTP padrão do Power Query. Os exemplos abaixo mostram como contornar essa situação.

Nesse cenário, você trabalhará com uma API REST que ocasionalmente retorna um código de status 500, indicando um erro interno do servidor. Nesses casos, você pode esperar alguns segundos e tentar novamente, potencialmente algumas vezes antes de desistir.

ManualStatusHandling

Se Web.Contents obtém uma resposta de código de status de 500, ela gera DataSource.Error por padrão. Você pode substituir esse comportamento ao fornecer uma lista de códigos como um argumento opcional para Web.Contents:

response = Web.Contents(url, [ManualStatusHandling={404, 500}])

Ao especificar os códigos de status dessa forma, o Power Query continuará processando a resposta da Web normalmente. No entanto, o processamento de resposta normal geralmente não é apropriado nesses casos. Você precisará entender que um código de resposta anormal foi recebido e executar uma lógica especial para lidar com ele. Para determinar o código de resposta retornado do serviço Web, você pode acessá-lo no registro meta que acompanha a resposta:

responseCode = Value.Metadata(response)[Response.Status]

Considerando que responseCode é 200 ou 500, você pode processar o resultado normalmente ou seguir sua lógica de repetição de espera que você criará na próxima seção.

IsRetry

O Power Query tem um cache local que armazena os resultados de chamadas anteriores para Web.Contents. Ao sondar a mesma URL para uma nova resposta ou ao tentar novamente após um status de erro, você precisará garantir que a consulta ignore os resultados armazenados em cache. Você pode fazer isso incluindo a opção IsRetry na chamada para a função Web.Contents. Neste exemplo, definiremos IsRetry como true após a primeira iteração do loop Value.WaitFor.

Value.WaitFor

Value.WaitFor() é uma função auxiliar padrão que geralmente pode ser usada sem modificação. Ela cria uma lista de tentativas de repetição.

Argumento producer

Isso contém a tarefa a ser (possivelmente) repetida novamente. É representada como uma função para que o número de iteração possa ser usado na lógica producer. O comportamento esperado producer retornará null se uma nova tentativa for determinada como necessária. Se algo diferente de null for retornado por producer, esse valor será retornado por Value.WaitFor.

Argumento delay

Contém a lógica a ser executada entre novas tentativas. É representada como uma função para que o número de iteração possa ser usado na lógica delay. O comportamento esperado é que delay retorne uma duração.

count Argumento (opcional)

Um número máximo de tentativas pode ser definido fornecendo um número para o argumento count.

Juntar as peças

O exemplo a seguir mostra como ManualStatusHandling e Value.WaitFor podem ser usados para implementar uma repetição atrasada no caso de uma resposta 500. O tempo de espera entre novas tentativas é duplo com cada tentativa, com no máximo cinco tentativas.

let
    waitForResult = Value.WaitFor(
        (iteration) =>
            let
                result = Web.Contents(url, [ManualStatusHandling = {500}, IsRetry = iteration > 0]),
                status = Value.Metadata(result)[Response.Status],
                actualResult = if status = 500 then null else result
            in
                actualResult,
        (iteration) => #duration(0, 0, 0, Number.Power(2, iteration)),
        5)
in
    if waitForResult = null then
        error "Value.WaitFor() Failed after multiple retry attempts"
    else
        waitForResult