Partilhar via


Usar bibliotecas de cliente do Azure para JavaScript e TypeScript

Para acessar programaticamente seus serviços do Azure, use as bibliotecas de cliente do Azure para JavaScript. Normalmente, essas bibliotecas têm escopo com o escopo do pacote npm @azure publicado pelo azure-sdk.

Diferenças entre bibliotecas de cliente e APIs REST

Use as informações a seguir para entender quando usar qual tipo de acesso.

  • As bibliotecas de cliente do Azure são o método preferencial de acessar seu serviço do Azure. Essas bibliotecas abstraem o código clichê necessário para gerenciar solicitações REST da plataforma Azure baseadas em nuvem, como autenticação, tentativas e registro.
  • As APIs REST do Azure são o método preferencial se você estiver:
    • Trabalhar com serviços de pré-visualização que não têm bibliotecas de cliente do Azure disponíveis. Considere seu código como visualização, que deve ser atualizada quando o serviço estiver disponível em geral com bibliotecas cliente.
    • Deseja fazer chamadas REST diretamente porque não quer que todo o SDK use uma única API REST ou porque deseja um controle mais profundo sobre as solicitações HTTP.

Cliente do Azure e bibliotecas de gerenciamento

As versões da biblioteca de cliente do Azure estão disponíveis como:

  • Gerenciamento: as bibliotecas de gerenciamento permitem que você crie e gerencie recursos do Azure. Você pode reconhecer essas bibliotecas em seus nomes de arm- pacote. O termo ARM indica o Azure Resource Manager.
  • Cliente: dado que um recurso do Azure já existe, use as bibliotecas de cliente para consumi-lo e interagir com ele.
    • Cada pacote README.md inclui documentação e amostras.

Instalar pacotes npm do Azure

As bibliotecas de cliente do Azure estão disponíveis gratuitamente no NPM. Instale SDKs individuais conforme necessário. Cada SDK fornece definições de TypeScript.

Para uso do cliente/navegador, as bibliotecas de cliente do Azure precisam ser adicionadas ao seu processo de agregação .

Usar o código de exemplo do pacote npm do Azure

Cada pacote inclui documentação para você começar rapidamente a usá-lo. Consulte os pacotes NPM específicos que você usa para saber como usá-los.

Fornecer credenciais de autenticação

As bibliotecas de cliente do Azure exigem credenciais para autenticar na plataforma Azure. As classes de credenciais fornecidas pelo @azure/identity oferecem vários benefícios:

  • Integração rápida
  • Método mais seguro
  • Separe o mecanismo de autenticação do código. Isso permite que você use o mesmo código localmente e na plataforma Azure enquanto as credenciais são diferentes.
  • Forneça autenticação encadeada para que vários mecanismos possam estar disponíveis.

Criar um cliente SDK e métodos de chamada

Depois de criar programaticamente uma credencial, passe a credencial para o seu cliente do Azure. O cliente pode exigir informações adicionais, como um ID de assinatura ou ponto de extremidade de serviço. Esses valores estão disponíveis no portal do Azure, para seu recurso.

O exemplo de código a seguir usa o DefaultAzureCredential e a biblioteca de cliente de arm assinatura para listar assinaturas que essa credencial tem acesso para ler.

const {
  ClientSecretCredential,
  DefaultAzureCredential,
} = require("@azure/identity");
const { SubscriptionClient } = require("@azure/arm-subscriptions");
require("dotenv").config();

let credentials = null;

const tenantId = process.env["AZURE_TENANT_ID"];
const clientId = process.env["AZURE_CLIENT_ID"];
const secret = process.env["AZURE_CLIENT_SECRET"];

if (process.env.NODE_ENV && process.env.NODE_ENV === "production") {
  // production
  credentials = new DefaultAzureCredential();
} else {
  // development
  if (tenantId && clientId && secret) {
    console.log("development");
    credentials = new ClientSecretCredential(tenantId, clientId, secret);
  } else {
    credentials = new DefaultAzureCredential();
  }
}

async function listSubscriptions() {
  try {
    // use credential to authenticate with Azure SDKs
    const client = new SubscriptionClient(credentials);

    // get details of each subscription
    for await (const item of client.subscriptions.list()) {
      const subscriptionDetails = await client.subscriptions.get(
        item.subscriptionId
      );
      /* 
        Each item looks like:
      
        {
          id: '/subscriptions/123456',
          subscriptionId: '123456',
          displayName: 'YOUR-SUBSCRIPTION-NAME',
          state: 'Enabled',
          subscriptionPolicies: {
            locationPlacementId: 'Internal_2014-09-01',
            quotaId: 'Internal_2014-09-01',
            spendingLimit: 'Off'
          },
          authorizationSource: 'RoleBased'
        },
    */
      console.log(subscriptionDetails);
    }
  } catch (err) {
    console.error(JSON.stringify(err));
  }
}

listSubscriptions()
  .then(() => {
    console.log("done");
  })
  .catch((ex) => {
    console.log(ex);
  });

Paginação assíncrona dos resultados

Um método SDK pode retornar um iterador assíncrono, PagedAsyncIterableIterator, para permitir resultados assíncronos. Os resultados podem usar tokens de paginação e continuação para dividir conjuntos de resultados.

O exemplo JavaScript a seguir demonstra a paginação assíncrona. O código define um tamanho de paginação artificialmente curto de 2 para demonstrar rápida e visualmente o processo quando você executa o código de exemplo na depuração.

const { BlobServiceClient } = require("@azure/storage-blob");

const blobAccountConnectionString = "REPLACE-WITH-YOUR-STORAGE-CONNECTION-STRING";
const blobAccountContainerName = "REPLACE-WITH-YOUR-STORAGE-CONTAINER-NAME";

const pageSize = 2;

const list = async () => {

  console.log(`List`);

  let continuationToken = "";
  let currentPage = 1;
  let containerClient=null;
  let currentItem = 1;

  // Get Blob Container - need to have items in container before running this code
  const blobServiceClient = BlobServiceClient.fromConnectionString(blobAccountConnectionString);
  containerClient = blobServiceClient.getContainerClient(blobAccountContainerName);

  do {

    // Get Page of Blobs
    iterator = (continuationToken != "") 
      ? containerClient.listBlobsFlat().byPage({ maxPageSize: pageSize, continuationToken }) 
      : containerClient.listBlobsFlat().byPage({ maxPageSize: pageSize });
    
    page = (await iterator.next()).value;

    // Display list
    if (page.segment?.blobItems) {
      console.log(`\tPage [${currentPage}] `);
      for (const blob of page.segment.blobItems) {
        console.log(`\t\tItem [${currentItem++}] ${blob.name}`);
      }
    };

    // Move to next page
    continuationToken = page.continuationToken;
    if (continuationToken) {
      currentPage++;
    }

  } while (continuationToken != "")
}

list(() => {
  console.log("done");
}).catch((ex) =>
  console.log(ex)
);

Saiba mais sobre paginação e iteradores no Azure:

Operações de execução prolongada

Um método SDK pode retornar uma resposta bruta de operação de longa execução (LRO). Esta resposta inclui informações incluindo:

  • O seu pedido concluído
  • O seu pedido ainda está em processo

O exemplo JavaScript a seguir demonstra como aguardar a conclusão de um LRO com .pollUntildone(), antes de continuar.

const { BlobServiceClient } = require("@azure/storage-blob");

const blobAccountConnectionString = "REPLACE-WITH-YOUR-STORAGE-CONNECTION-STRING";
const blobAccountContainerName = `test-${Date.now().toString()}`;

const files = [
  {
    "url": "https://github.com/Azure/azure-sdk-for-js/blob/main/README.md",
    "fileName": "README.md"
  },
  {
    "url": "https://github.com/Azure/azure-sdk-for-js/blob/main/gulpfile.ts",
    "fileName": "gulpfile.ts"
  },
  {
    "url": "https://github.com/Azure/azure-sdk-for-js/blob/main/rush.json",
    "fileName": "rush.json"
  },  
  {
    "url": "https://github.com/Azure/azure-sdk-for-js/blob/main/package.json",
    "fileName": "package.json"
  },
  {
    "url": "https://github.com/Azure/azure-sdk-for-js/blob/main/tsdoc.json",
    "fileName": "tsdoc.json"
  },
];

const upload = async() => {

  // get container client
  const blobServiceClient = BlobServiceClient.fromConnectionString(blobAccountConnectionString);

  // get container's directory client
  const containerClient = blobServiceClient.getContainerClient(blobAccountContainerName);

  files.forEach(async(file) =>{
    await (

      await containerClient
        .getBlobClient(file.fileName)
        .beginCopyFromURL(file.url)
  
    ).pollUntilDone();
  })
}

upload(() => {
  console.log("done");
}).catch((ex) =>
  console.log(ex)
);

Saiba mais sobre operações de longa duração no Azure:

Cancelando operações assíncronas

O pacote @azure/abort-controller fornece classes AbortController e AbortSignal. Use o AbortController para criar um AbortSignal, que pode ser passado para as operações do SDK do Azure para cancelar o trabalho pendente. As operações do SDK do Azure podem ser:

  • Abortado com base na sua própria lógica
  • Abortado com base em um limite de tempo limite
  • Abortado com base no sinal de uma tarefa pai
  • Abortado com base no sinal de uma tarefa pai ou em um limite de tempo limite

Saiba mais:

Registro detalhado do SDK

Ao usar um SDK do Azure, pode haver momentos em que você precise depurar seu aplicativo.

  • Para habilitar o registro em log em tempo de compilação, defina a variável de ambiente AZURE_LOG_LEVEL como info.

  • Para habilitar o registro em log em tempo de execução, use o pacote @azure/logger :

    import { setLogLevel } from "@azure/logger";
    
    setLogLevel("info");
    

Agregação

Saiba mais sobre a agregação com o SDK do Azure:

Próximos passos