Compartilhar via


Tutorial: usar a API Web do portal

Observação

Desde o dia 12 de outubro de 2022, os portais do Power Apps passaram a ser Power Pages. Mais Informações: O Microsoft Power Pages já está disponível para todos (blog)
Em breve, migraremos e mesclaremos a documentação dos portais do Power Apps com a documentação do Power Pages.

Neste tutorial, você configurará uma página da Web e um modelo personalizado da Web que usará a API Web para ler, gravar, atualizar e excluir registros da tabela de contatos.

Observação

Você pode alterar os nomes das colunas ou usar uma tabela diferente enquanto segue as etapas neste exemplo.

Etapa 1. Criar configurações do site

Antes de usar a API Web de portais, você deve habilitar as configurações de site necessárias com o aplicativo Gerenciamento do Portal. As configurações do site dependem da tabela que deseja usar ao interagir com a API Web.

  1. Vá para  Power Apps.

  2. No painel esquerdo, selecione Aplicativos.

  3. Selecione o aplicativo Gerenciamento do Portal. 

    Inicie o aplicativo de Gerenciamento do Portal.

  4. No painel esquerdo do aplicativo Gerenciamento do Portal, selecione Configurações do Site.

    Abra configurações de site no aplicativo de Gerenciamento de Portal.

  5. Selecione Novo.

  6. Na caixa Nome , insira Webapi/contact/enabled.

  7. Na lista Site, selecione o registro do site.

  8. Na caixa Valor, insira verdadeiro.

    Habilite a tabela de contatos para a configuração do site de API Web.

  9. Selecione Salvar e Fechar.

  10. Selecione Novo.

  11. Na caixa Nome, insira Webapi/contact/fields.

  12. Na lista Site, selecione o registro do site.

  13. Na caixa Valor, insira
    firstname,lastname,fullname,emailaddress1,telephone1

    Habilite a configuração de site de campos da tabela de contatos de API Web.

  14. Selecione Salvar e Fechar.

  15. Selecione Novo.

  16. Na caixa Nome, insira Webapi/error/innererror.

    Habilite a configuração do site de erro interno da API Web.

  17. Na lista Site, selecione o registro do site.

  18. Na caixa Valor, insira verdadeiro.

  19. Selecione Salvar e Fechar.

  20. Verifique as configurações do site para a API Web.

Etapa 2. Configurar permissões

Será preciso configurar permissões para que os usuários possam usar o recurso API Web. Neste exemplo, você habilitará a tabela Contato para permissões de tabela, criará uma função Web usando a API Web, adicionará as permissões de tabela para a tabela Contato a esta função Web e, depois, adicionará a função Web a usuários para permitir que usem a API Web.

  1. No painel esquerdo do aplicativo Gerenciamento do Portal, selecione Permissões da Tabela.

  2. Selecione Novo.

  3. Na caixa Nome, insira Permissão da Tabela de Contatos.

  4. Na lista Nome da Tabela, selecione Contato (contato).

  5. Na lista Site, selecione o registro do site.

  6. Na lista Tipo de Acesso, selecione Global.

  7. Selecione os privilégios Ler, Gravar, Criar e Excluir.

  8. Selecione Salvar e Fechar.

    Permissões da tabela de contato.

Criar uma função Web

Você pode usar uma função Web existente em seu site ou criar uma nova função Web.

  1. No painel esquerdo, selecione Funções Web. 

  2. Selecione Novo.

  3. Na caixa Nome, insira Usuário da API Web (ou qualquer nome que melhor reflita a função do usuário que acessa esta funcionalidade).

  4. Na lista Site, selecione o registro do site.

    Adicionar função Web do Usuário da API Web.

  5. Selecione  Salvar.

Adicionar permissões da tabela relacionada

  1. Com a função Web nova ou existente, selecione Relacionado > Permissões da Tabela.

    Adicionar permissões de tabela relacionada à função Web.

  2. Selecione Adicionar Permissão de Tabela Existente.

  3. Selecione Permissão da Tabela de Contatos, criada anteriormente.

    Selecione permissão da tabela de contato.

  4. Selecione Adicionar.

  5. Selecione Salvar e Fechar.

    Exibição de permissões de tabela.

Adicione contatos à função Web

  1. No painel esquerdo, selecione Contatos.

  2. Selecione uma conta que você queira usar neste exemplo para a API Web.

    Observação

    Esse contato é a conta de usuário usada neste exemplo para testar a API Web. Selecione o contato correto em seu portal.

  3. Selecione Relacionado > Funções Web.

    Selecionar funções Web relacionadas.

  4. Selecione Adicionar uma Função Web Existente.

  5. Selecione a função Usuário da API Web criada anteriormente.

  6. Selecione Adicionar.

    Exibição associada à função Web.

  7. Selecione Salvar e Fechar.

Etapa 3. Criar uma página da Web

Agora que você habilitou a API Web e configurou as permissões do usuário, crie uma página da Web com código de exemplo para visualizar, editar, criar e excluir registros.

  1. No painel esquerdo do aplicativo Gerenciamento do Portal, selecione Página da Web.

  2. Selecione Nova.

  3. Na caixa Nome, digite webapi.

  4. Na lista Site, selecione o registro do site.

  5. Para Página Primária, selecione Página Inicial.

  6. Para URL Parcial, digite webapi.

  7. Para Modelo de Página, selecione Página Inicial.

  8. Para Estado da Publicação, selecione Publicado.

  9. Selecione Salvar.

    Página da Web.

  10. Selecione Relacionado > Páginas da Web.

    Páginas da Web Relacionadas

  11. De Exibição Associada à Página da Web, selecione webapi.

    Exibição Associada à Página da Web.

  12. Role para baixo até a seção Conteúdo e depois vá para Copiar (HTML) (Designer de HTML).

    Copiar conteúdo HTML

  13. Selecione a guia HTML.

    Selecione a guia HTML

  14. Copie o seguinte trecho de código de exemplo e cole-o no designer de HTML.

        <!-- Sample code for Web API demonstration -->
    <style>
        #processingMsg {
            width: 150px;
            text-align: center;
            padding: 6px 10px;
            z-index: 9999;
            top: 0;
            left: 40%;
            position: fixed;
            -webkit-border-radius: 0 0 2px 2px;
            border-radius: 0 0 2px 2px;
            -webkit-box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
            box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
            display: none;
        }
    
        table td[data-attribute] .glyphicon-pencil {
            margin-left: 5px;
            opacity: 0;
        }
    
        table td[data-attribute]:hover .glyphicon-pencil {
            opacity: 0.7;
        }
    </style>
    
    <script>
      $(function() {
        //Web API ajax wrapper
        (function(webapi, $) {
          function safeAjax(ajaxOptions) {
            var deferredAjax = $.Deferred();
            shell.getTokenDeferred().done(function(token) {
              // Add headers for ajax
              if (!ajaxOptions.headers) {
                $.extend(ajaxOptions, {
                  headers: {
                    "__RequestVerificationToken": token
                  }
                });
              } else {
                ajaxOptions.headers["__RequestVerificationToken"] = token;
              }
              $.ajax(ajaxOptions)
                .done(function(data, textStatus, jqXHR) {
                  validateLoginSession(data, textStatus, jqXHR, deferredAjax.resolve);
                }).fail(deferredAjax.reject); //ajax
            }).fail(function() {
              deferredAjax.rejectWith(this, arguments); // On token failure pass the token ajax and args
            });
            return deferredAjax.promise();
          }
          webapi.safeAjax = safeAjax;
        })(window.webapi = window.webapi || {}, jQuery)
        // Notification component
        var notificationMsg = (function() {
          var $processingMsgEl = $('#processingMsg'),
            _msg = 'Processing...',
            _stack = 0,
            _endTimeout;
          return {
            show: function(msg) {
              $processingMsgEl.text(msg || _msg);
              if (_stack === 0) {
                clearTimeout(_endTimeout);
                $processingMsgEl.show();
              }
              _stack++;
            },
            hide: function() {
              _stack--;
              if (_stack <= 0) {
                _stack = 0;
                clearTimeout(_endTimeout);
                _endTimeout = setTimeout(function() {
                  $processingMsgEl.hide();
                }, 500);
              }
            }
          }
        })();
        // Inline editable table component
        var webAPIExampleTable = (function() {
          var trTpl = '<% _.forEach(data, function(data){ %>' +
            '<tr data-id="<%=data.id%>" data-name="<%=data.fullname%>">' +
            '<% _.forEach(columns, function(col){ %>' +
            '<td data-attribute="<%=col.name%>" data-label="<%=col.label%>" data-value="<%=data[col.name]%>">' +
            '<%-data[col.name]%><i class="glyphicon glyphicon-pencil"></i>' +
            '</td>' +
            '<% }) %>' +
            '<td>' +
            '<button class="btn btn-default delete" type="submit"><i class="glyphicon glyphicon-trash" aria-hidden="true"></i></button>' +
            '</td>' +
            '</tr>' +
            '<% }) %>';
          var tableTpl = '<table class="table table-hover">' +
            '<thead>' +
            '<tr>' +
            '<% _.forEach(columns, function(col){ %>' +
            '<th><%=col.label%></th>' +
            '<% }) %>' +
            '<th>' +
            '<button class="btn btn-default add" type="submit">' +
            '<i class="glyphicon glyphicon-plus" aria-hidden="true"></i> Add Sample Record' +
            '</button>' +
            '</th>' +
            '</tr>' +
            '</thead>' +
            '<tbody>' + trTpl + '</tbody>' +
            '</table>';
          function getDataObject(rowEl) {
            var $rowEl = $(rowEl),
              attrObj = {
                id: $rowEl.attr('data-id'),
                name: $rowEl.attr('data-name')
              };
            $rowEl.find('td').each(function(i, el) {
              var $el = $(el),
                key = $el.attr('data-attribute');
              if (key) {
                attrObj[key] = $el.attr('data-value');
              }
            })
            return attrObj;
          }
          function bindRowEvents(tr, config) {
            var $row = $(tr),
              $deleteButton = $row.find('button.delete'),
              dataObj = getDataObject($row);
            $.each(config.columns, function(i, col) {
              var $el = $row.find('td[data-attribute="' + col.name + '"]');
              $el.on('click', $.proxy(col.handler, $el, col, dataObj));
            });
            //User can delete record using this button
            $deleteButton.on('click', $.proxy(config.deleteHandler, $row, dataObj));
          }
          function bindTableEvents($table, config) {
            $table.find('tbody tr').each(function(i, tr) {
              bindRowEvents(tr, config);
            });
            $table.find('thead button.add').on('click', $.proxy(config.addHandler, $table));
          }
          return function(config) {
            var me = this,
              columns = config.columns,
              addHandler = config.addHandler,
              deleteHandler = config.deleteHandler,
              $table;
            me.render = function(el) {
              $table = $(el).html(_.template(tableTpl)({
                columns: columns,
                data: me.data
              })).find('table');
              bindTableEvents($table, {
                columns: columns,
                addHandler: addHandler,
                deleteHandler: deleteHandler
              });
            }
            me.addRecord = function(record) {
              $table.find('tbody tr:first').before(_.template(trTpl)({
                columns: columns,
                data: [record]
              }));
              bindRowEvents($table.find('tbody tr:first'), config);
            }
            me.updateRecord = function(attributeName, newValue, record) {
              $table.find('tr[data-id="' + record.id + '"] td[data-attribute="' + attributeName + '"]').text(newValue);
            }
            me.removeRecord = function(record) {
              $table.find('tr[data-id="' + record.id + '"]').fadeTo("slow", 0.7, function() {
                $(this).remove();
              });
            }
          };
        })();
        //Applicaton ajax wrapper 
        function appAjax(processingMsg, ajaxOptions) {
          notificationMsg.show(processingMsg);
          return webapi.safeAjax(ajaxOptions)
            .fail(function(response) {
              if (response.responseJSON) {
                alert("Error: " + response.responseJSON.error.message)
              } else {
                alert("Error: Web API is not available... ")
              }
            }).always(notificationMsg.hide);
        }
        function loadRecords() {
          return appAjax('Loading...', {
            type: "GET",
            url: "/_api/contacts?$select=fullname,firstname,lastname,emailaddress1,telephone1",
            contentType: "application/json"
          });
        }
        function addSampleRecord() {
          //Sample data to create a record - change as appropriate
          var recordObj = {
            firstname: "Willie",
            lastname: "Huff" + _.random(100, 999),
            emailaddress1: "Willie.Huff@contoso.com",
            telephone1: "555-123-4567"
          };
          appAjax('Adding...', {
            type: "POST",
            url: "/_api/contacts",
            contentType: "application/json",
            data: JSON.stringify(recordObj),
            success: function(res, status, xhr) {
              recordObj.id = xhr.getResponseHeader("entityid");
              recordObj.fullname = recordObj.firstname + " " + recordObj.lastname;
              table.addRecord(recordObj);
            }
          });
          return false;
        }
        function deleteRecord(recordObj) {
          var response = confirm("Are you sure, you want to delete \"" + recordObj.name + "\" ?");
          if (response == true) {
            appAjax('Deleting...', {
              type: "DELETE",
              url: "/_api/contacts(" + recordObj.id + ")",
              contentType: "application/json",
              success: function(res) {
                table.removeRecord(recordObj);
              }
            });
          }
          return false;
        }
        function updateRecordAttribute(col, recordObj) {
          var attributeName = col.name,
            value = recordObj[attributeName],
            newValue = prompt("Please enter \"" + col.label + "\"", value);
          if (newValue != null && newValue !== value) {
            appAjax('Updating...', {
              type: "PUT",
              url: "/_api/contacts(" + recordObj.id + ")/" + attributeName,
              contentType: "application/json",
              data: JSON.stringify({
                "value": newValue
              }),
              success: function(res) {
                table.updateRecord(attributeName, newValue, recordObj);
              }
            });
          }
          return false;
        }
        var table = new webAPIExampleTable({
          columns: [{
            name: 'firstname',
            label: 'First Name',
            handler: updateRecordAttribute
          }, {
            name: 'lastname',
            label: 'Last Name',
            handler: updateRecordAttribute
          }, {
            name: 'emailaddress1',
            label: 'Email',
            handler: updateRecordAttribute
          }, {
            name: 'telephone1',
            label: 'Telephone',
            handler: updateRecordAttribute
          }],
          data: [],
          addHandler: addSampleRecord,
          deleteHandler: deleteRecord
        });
        loadRecords().done(function(data) {
          table.data = _.map(data.value, function(record){
            record.id = record.contactid;
            return record;
          });
          table.render($('#dataTable'));
        });
      });
    </script>
    <div id="processingMsg" class="alert alert-warning" role="alert"></div>
    <div id="dataTable"></div>
    

    Cole o código.

  15. Selecione Salvar e Fechar.

Etapa 4. Limpar o cache de portais

Você criou uma página de exemplo webapi para testar a funcionalidade da API Web. Antes de começar, certifique-se de que o cache de portais do Power Apps tenha sido limpo para que as alterações do aplicativo Gerenciamento do Portal sejam refletidas em seu portal.

IMPORTANTE: limpar o cache do servidor no portal causa uma degradação temporária do desempenho do portal, enquanto os dados são recarregados do Microsoft Dataverse.

Para limpar o cache:

  1. Entre no seu portal como membro da função Web Administradores.

  2. Altere a URL ao anexar /_‑services/about ao final. Por exemplo, se a URL do portal for  https://contoso.powerappsportals.com, altere-a para  https://contoso.powerappsportals.com/_services/about.

    Limpar o cache.

    OBSERVAÇÃO: você deve ser membro da função Web Administradores para limpar o cache. Se você vir uma tela em branco, verifique as atribuições da função Web.

  3. Selecione Limpar cache.

Mais informações:  Limpar o cache do servidor para um portal

Etapa 5. Use a API da Web para ler, exibir, editar, criar e excluir

A página da Web de amostra com a URL webapi criada anteriormente está agora pronta para teste.

Para testar a funcionalidade da API Web:

  1. Entre em seu portal com a conta de usuário que foi atribuída à função Usuário da API Web que você criou anteriormente.

  2. Vá para a página da Web webapi criada anteriormente. Por exemplo, https://contoso.powerappsportals.com/webapi. A API Web recuperará registros do Microsoft Dataverse.

    Amostra da página da Web webapi.

  3. Selecione Adicionar Registro de Exemplo para adicionar o registro de exemplo do script.

  4. Selecione um campo. Neste exemplo, selecionamos Email para alterar o email de um contato.

    Editar o email

  5. Selecione botão Excluir para excluir um registro.

Agora que você criou uma página da Web com uma amostra para ler, editar, criar e excluir registros, pode personalizar os formulários e o layout.

Próxima etapa

Compor solicitações HTTP e tratar erros

Confira também

Visão geral da API Web de portais
Operações de gravação, atualização e exclusão de portais usando a API Web
Portais leem operações usando a API Web
Configurar permissões de coluna

Observação

Você pode nos falar mais sobre suas preferências de idioma para documentação? Faça uma pesquisa rápida. (Observe que esta pesquisa está em inglês)

A pesquisa levará cerca de sete minutos. Nenhum dado pessoal é coletado (política de privacidade).