Requisições em lote utilizando Graph

Olá tudo bom com vocês?

Quantas vezes nós estamos fazendo algum desenvolvimento e precisamos consultar diversas fontes de conteúdo para gerar algum resultado? Estes dados podem inclusive ter alguma dependência. E assim como fazemos? Primeiro uma requisição para obter um tipo de dado, e depois outra requisição, e outra…e outra……..E assim demoramos a obter o resultado. Caso estes dados estejam disponíveis no Office 365, podemos usar o Microsoft Graph para fazer várias consultas em apenas uma requisição.

OBS.: Já escrevi sobre requisições em lote no SharePoint OnLine. Para ler o texto basta acessar o post: https://pmneto.com/requisicoes-em-lote-batch-no-sharepoint-online-parte-1/

Mãos a obra!

Para fazer a demostração estou utilizando o Graph Explorer. Ele é uma plataforma da Microsoft onde é possível brincar um pouco com os recursos do Graph. Inclusive é possível logar com a sua conta Microsoft e fazer consultas às suas informações.

Para fazer a consultas em lote utilizando o Graph precisamos usar o endpoint https://graph.microsoft.com/v1.0/$batch. Este endpoint aceita apenas requisições do tipo POST. Outro ponto interessante é que precisamos informar quais são as consultas/ações que devem ser feitas nesta requisição. Para isso é necessário informar um JSON com a seguinte estrutura:

{
        requests: [
          {
            id: "1",
            method: "GET",
            url: "/me/calendars"
          },
          {
            id: "2",
            method: "GET",
            url: "/me/messages"
          }

        ]
    }

Explicando o JSON:

  • Linha 2: Criamos um array com o nome de requests.
  • Linha 3: Criamos o objeto que irá conter a requisição.
  • Linha 4: Informamos qual o ID da ação a ser executada;
  • Linha 5: Qual verbo deve ser utilizado.
  • Linha 6: Qual a url que deverá ser executada.

Neste exemplo estamos consultando meus calendários e minhas mensagens de e-mail.

Testando:

Acesse o Graph Explorer no link https://developer.microsoft.com/en-us/graph/graph-explorer.

Na barra de endereço existente altere a requisição para POST e informe a url https://graph.microsoft.com/v1.0/$batch.

Em Request Body informe o JSON utilizado acima:

{
        requests: [
          {
            id: "1",
            method: "GET",
            url: "/me/calendars"
          },
          {
            id: "2",
            method: "GET",
            url: "/me/messages"
          }

        ]
    }

Agora basta clicar em Run Query e ver o resultado:

O resultado será um JSON com o identificador de cada uma das requisições e o resultado da requisição:

{
    "responses": [
        {
            "id": "1",
            "status": 200,
            "headers":{},
            "body":{}
        },
        {
            "id": "2",
            "status": 200,
            "headers":{},
            "body":{}
        }
    ]
}

Detalhes da resposta:

  • Linha 2: Array responses, que possui o resultado das nossas requisições.
  • Linha 3: O Objeto correspondente a requisição.
  • Linha 4: o Identificador da requisição. É o mesmo identificador utilizado para fazer a requisição.
  • Linha 5: Código de status da requisição.
  • Linha 6: O header recebido da requisição.
  • Linha 7: O resultado da requsição. Nesta propriedade que estará o resultado da requisição feita. No nosso exemplo estará a lista dos meus calendários:

Interessante não? O legal que podemos usar isso, por exemplo, no SharePoint Framework. Abaixo um código que fiz para brincar um pouco com estes requests:

protected getWorkSheetInformation(): Promise<IWorksheet> {
    return new Promise<IWorksheet>((resolve, reject) => {
      let requests = {
        requests: [
          {
            id: "1",
            method: "GET",
            url:
              "/sites/oie.sharepoint.com/drives/b!IAPGWg-JeU-nINjIf/items/01GGCDGZAMG6YSR/workbook/worksheets('Compras')/tables('1')/rows"
          },
          {
            id: "2",
            method: "GET",
            url:
              "/sites/oie.sharepoint.com/drives/b!IA-JeU-nINjI/items/01GGCDGZAMG6YSR/workbook/worksheets('Compras')/tables('1')/columns"
          }

        ]
      };

      this.clientContext.msGraphClientFactory
        .getClient()
        .then((msClient: MSGraphClient) => {
          msClient.api('/$batch')
          .version("v1.0")
          .post(requests,((batchError,batchResults)=>{
            if(batchError !== null){
              console.warn(batchError);
              return;
            }
            let rows=batchResults.responses[0].body.value;
            let columns = batchResults.responses[1].body.value;
            resolve({
              Columns:columns,
              Rows:rows
            });

          }));
        });
    });
  }

Bom pessoal por hoje é só! Qualquer dúvida podem me procurar que, assim que possível, tentarei responder.

Referências: