Compartir por


Titorial: usar a API web dos portais

Nota

A partir do 12 de outubro de 2022, Portais de Power Apps é Power Pages. Máis información: Microsoft Power Pages xa está dispoñible de forma xeral (blog)
Proximamente migraremos e uniremos a documentación de Portais de Power Apps coa documentación de Power Pages.

Neste titorial, configurará unha páxina web e un modelo web personalizado que utilizará a API web para ler, escribir, actualizar e eliminar rexistros desde a táboa de contactos.

Nota

Pode cambiar os nomes das columnas ou usar unha táboa diferente seguindo os pasos deste exemplo.

Paso 1. Creación de donfiguracións do sitio

Para poder usar a API web de portais, ten que activar a configuración do sitio requirida coa aplicación Xestión de portais. A configuración do sitio depende da táboa que desexe usar ao interactuar coa API web.

  1. Ir a Power Apps.

  2. No panel esquerdo, selecciona Aplicacións.

  3. Seleccione a aplicación Xestión do portal .

    Lance a aplicación Xestión do portal.

  4. No panel esquerdo da aplicación Xestión do portal , seleccione Configuración do sitio.

    Abra a configuración do sitio na aplicación Xestión do portal.

  5. Seleccione Novo.

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

  7. Na lista  Sitio web , seleccione o rexistro do seu sitio web.

  8. Na caixa  Valor , introduza true.

    Active a táboa de contactos para a configuración do sitio da API web.

  9. Seleccione Gardar e amp; Pechar.

  10. Seleccione Novo.

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

  12. Na lista  Sitio web , seleccione o rexistro do seu sitio web.

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

    Active a configuración do sitio dos campos da táboa de contactos da API web.

  14. Seleccione Gardar e amp; Pechar.

  15. Seleccione Novo.

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

    Active a configuración do sitio de erros internos da API web.

  17. Na lista  Sitio web , seleccione o rexistro do seu sitio web.

  18. Na caixa  Valor , introduza true.

  19. Seleccione Gardar e amp; Pechar.

  20. Verifique a configuración do sitio para a  API web.

Paso 2. Configurar permisos

Terá que configurar os permisos para que os usuarios poidan usar a función API web. Neste exemplo, activará a táboa Contacto para os permisos de táboa, creará unha función web para usar a API web, engadirá os permisos de táboa para a táboa Contacto a esta función web e, a continuación, engadirá a función web aos usuarios para permitirlles usar a API web.

  1. No panel esquerdo da aplicación Xestión do portal , seleccione Permisos da táboa.

  2. Seleccione Novo.

  3. Na caixa  Nome , introduza Permiso da táboa de contacto.

  4. Na lista Nome da táboa , seleccione Contacto (contacto).

  5. Na lista  Sitio web , seleccione o rexistro do seu sitio web.

  6. Na lista Tipo de acceso , seleccione Global.

  7. Seleccione os privilexios Ler, Escribir, Crear e Eliminar.

  8. Seleccione Gardar e amp; Pechar.

    Permisos da táboa de contactos.

Cear unha función web

Pode usar unha función web existente no seu sitio web ou crear unha nova función web.

  1. No panel esquerdo, seleccione Roles web .

  2. Seleccione Novo.

  3. Na caixa  Nome , introduza Usuario da API web (ou calquera nome que mellor reflicta a función do usuario que accede esta funcionalidade).

  4. Na lista  Sitio web , seleccione o rexistro do seu sitio web.

    Engada a función web de usuario da API web.

  5. Seleccione Gardar.

Engadir permisos de táboa relacionados

  1. Coa función web nova ou existente, seleccione Relacionados > Permisos de táboa.

    Engadir permisos de táboa relacionados a unha función web.

  2. Seleccione Engadir permiso de táboa existente.

  3. Seleccione Permiso de táboa de contacto, creado anteriormente.

    Seleccione Permiso de táboa de contacto.

  4. Seleccione Engadir.

  5. Seleccione Gardar e amp; Pechar.

    Visualización de permisos de táboa.

Engadir contactos á función web

  1. No panel esquerdo, selecciona Contactos.

  2. Seleccione un contacto que desexe utilizar neste exemplo para a API web.

    Nota

    Este contacto é a conta de usuario empregada neste exemplo para probar a API web. Asegúrese de seleccionar o contacto correcto no seu portal.

  3. Seleccione Relacionados > Roles web.

    Selección de funcións web relacionadas.

  4. Seleccione Engadir función web existente.

  5. Seleccione a función Usuario da API web , creada anteriormente.

  6. Seleccione Engadir.

    Visualización asociada de funcións web.

  7. Seleccione Gardar e amp; Pechar.

Paso 3. Crear unha páxina web

Agora que activou a API web e configurou os permisos de usuario, cree unha páxina web con código de mostra para ver, editar, crear e eliminar rexistros.

  1. No panel esquerdo da aplicación Xestión do portal , seleccione Páxinas web.

  2. Seleccione Nova.

  3. Na caixa Nome, introduza webapi.

  4. Na lista Sitio web, seleccione o rexistro do seu sitio web.

  5. Para Páxina primaria, seleccione Inicio.

  6. Para URL parcial, introduza webapi.

  7. Para Modelo de páxina, seleccione Inicio.

  8. Para Estado de publicación, seleccione Publicado.

  9. Seleccione Gardar.

    Páxina web.

  10. Seleccione Relacionado > Páxinas web.

    Páxinas web relacionadas

  11. En Vista asociada á páxina web, seleccione webapi.

    Visualización asociada de páxinas web.

  12. Desprácese cara abaixo ata a sección Contido e logo vaia a Copiar (HTML) (deseñador de HTML).

    Copiar contido HTML

  13. Seleccione o separador HTML.

    Seleccione o separador HTML

  14. Copie o seguinte fragmento de código de exemplo e pégueo no Deseñador 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>
    

    Pegue o código.

  15. Seleccione Gardar e pechar.

Paso 4. Borrar a memoria caché dos portais

Creaches unha webapi páxina de mostra para probar a funcionalidade da API web. Antes de comezar, asegúrese de que a caché de portais de Power Apps se borrase para que os cambios da aplicación Xestión do portal se reflictan no seu portal.

IMPORTANTE: Limpar a caché no servidor do portal degrada temporalmente o rendemento do portal mentres se cargan de novo os datos desde Microsoft Dataverse.

Para borrar a caché:

  1. Inicie sesión no seu portal como membro do rol web de Administradores.

  2. Cambia o URL engadindo /_ servizos/about ao final. Por exemplo, se o URL do portal é  https://contoso.powerappsportals.com, cámbiao a https://contoso.powerappsportals.com/_services/about.

    Borrar a caché.

    NOTA: Debes ser membro da función web Administradores para borrar a caché. Se ve unha pantalla en branco, verifique as asignacións de roles web.

  3. Seleccione Borrar caché.

Máis información: Borrar a caché do servidor dun portal

Paso 5. Usar a API web para ler, ver, editar, crear e eliminar

A páxina web de mostra co URL webapi creada anteriormente xa está lista para probarse.

Para probar a funcionalidade da API web:

  1. Inicie sesión no seu portal coa conta de usuario á que se lle asignou o rol de Usuario da API web que creou anteriormente.

  2. Vaia á páxina web webapi creada anteriormente. Por exemplo, https://contoso.powerappsportals.com/webapi. A API web recuperará os rexistros de Microsoft Dataverse.

    Páxina webapi de mostra.

  3. Seleccione Engadir rexistro de mostra para engadir o rexistro de mostra do script.

  4. Seleccione un campo. Neste exemplo, seleccionamos Correo electrónico para cambiar o enderezo de correo electrónico dun contacto.

    Editar correo electrónico

  5. Seleccione Botón Eliminar para eliminar un rexistro.

Agora que creou unha páxina web cunha mostra para ler, ver, editar, crear e eliminar rexistros, pode personalizar os formularios e o deseño.

Seguinte paso

Redactar solicitudes HTTP e xestionar erros

Consulte tamén

Visión xeral da API web dos portais
Operacións de escritura, actualización e eliminación de portais mediante a API web
Operacións de lectura de portais mediante a API web
Configurar permisos de columnas

Nota

Pode indicarnos as súas preferencias para o idioma da documentación? Realice unha enquisa breve. (teña en conta que esa enquisa está en inglés)

Esta enquisa durará sete minutos aproximadamente. Non se recompilarán datos persoais (declaración de privacidade).