Dela via


Självstudier: Använda webb-API:et med portaler

Anteckning

Från och med den 12 oktober 2022 byter Power Apps-portaler namn till Power Pages. Mer information: Microsoft Power Pages är nu allmänt tillgänglig (blogg)
Vi kommer snart migrera och sammanfoga dokumentationen för Power Apps-portaler med Power Pages-dokumentationen.

I den här självstudien skapar du en webbsida och en anpassad webbmall som använder webb-API:t för att läsa, skriva, uppdatera och ta bort poster från kontakttabellen.

Anteckning

Du kan ändra kolumnnamnen eller använda en annan tabell och följa stegen i det här exemplet.

Steg 1. Skapa webbplatsinställningar

Innan du kan använda webb-API:t för portalerna måste du aktivera de webbplatsinställningar som krävs i programmet Portalhantering. Webbplatsinställningarna beror på tabellen som du vill använda när du interagerar med webb-API:et.

  1. Gå till  Power Apps.

  2. I vänstra fönstret väljer du Appar.

  3. Välj programmet Portalhantering .

    Öppna programmet Portalhantering.

  4. I vänster fönster av programmet Portalhantering väljer du Webbplatsinställningar.

    Öppna webplatsinställningar i programmet Portalhantering.

  5. Välj  Nytt.

  6. I rutan Namn anger du Webbapi/kontakt/aktiverad.

  7. I listan Webbplats väljer du din webbplatspost.

  8. I rutan Värde anger du sant.

    Aktivera kontakttabell för webbplatsinställningen Webb-API.

  9. Välj Spara och stäng.

  10. Välj  Nytt.

  11. I rutan Namn anger du Webbapi/kontakt/fält.

  12. I listan Webbplats väljer du din webbplatspost.

  13. I rutan Värde anger du
    förnamn,efternamn,fullständigtnamn,epostadress1,telefon1

    Aktivera kontakttabellfält för webbplatsinställningen Webb-API.

  14. Välj Spara och stäng.

  15. Välj  Nytt.

  16. I rutan Namn anger du Webbapi/fel/interntfel.

    Aktivera webbplatsinställningen för det interna felet för Webb-API.

  17. I listan Webbplats väljer du din webbplatspost.

  18. I rutan Värde anger du sant.

  19. Välj Spara och stäng.

  20. Verifiera webbplatsinställningarna för webb-API.

Steg 2. Konfigurera behörigheter

Du måste konfigurera behörigheter så att användarna kan använda webb-API-funktionen. I det här exemplet ska du aktivera tabellen Kontakt för tabellbehörigheter, skapa en webbroll med webb-API:t, lägga till tabellbehörigheter för tabellen Kontakt till den här webbrollen och sedan lägga till webbrollen till användare för att låta dem använda webb-API:t.

  1. I vänster fönster av programmet Portalhantering väljer du Tabellbehörigheter.

  2. Välj  Nytt.

  3. I rutan Namn ange Behörighet för kontakttabell.

  4. I listan Tabellnamn , välj Kontakt (kontakt).

  5. I listan Webbplats väljer du din webbplatspost.

  6. I listan Åtkomsttyp väljer du Global.

  7. Välj behörigheterna läsa, skriv, skapa och ta bort.

  8. Välj Spara och stäng.

    Kontakttabellbehörigheter

Skapa en webbroll

Du kan använda en befintlig webbroll på webbplatsen eller skapa en ny webbroll.

  1. I den vänstra rutan väljer du Webbroller .

  2. Välj  Nytt.

  3. I rutan Namn , ange Webb-API-användare (eller vilket namn som helst som bäst återspeglar rollen för användaren som använder den här funktionen).

  4. I listan Webbplats väljer du din webbplatspost.

    Lägg till webb-API-användarwebbroll.

  5. Välj  Spara.

Lägg till relaterade tabellbehörigheter

  1. Med den nya eller befintliga webbrollen väljer du Relaterad > Tabellbehörigheter.

    Lägg till relaterade tabellbehörigheter till webbroll.

  2. Välj Lägg till befintlig tabellbehörighet.

  3. Välj kontakttabellbehörighet, skapad tidigare.

    Välj kontakttabellbehörigheter.

  4. Markera Lägga till.

  5. Välj Spara och stäng.

    Tabellbehörighetsvy.

Lägg till kontakter i webbrollen

  1. I den vänstra rutan väljer du Kontakter.

  2. Välj en kontakt som du vill använda i det här exemplet för webb-API:t.

    Anteckning

    Den här kontakten är användarkontot som används i det här exemplet för att testa webb-API:t. Kontrollera att du väljer rätt kontakt på portalen.

  3. Välj Relaterad > Webbroller.

    Välja relaterade webbroller.

  4. Välj Lägg till befintlig webbroll.

  5. Välj rollen Webb-API-användare som skapats tidigare.

  6. Markera Lägga till.

    Webbroll – associerad vy.

  7. Välj Spara och stäng.

Steg 3. Skapa webbsida

Nu när du har aktiverat webb-API:t och konfigurerat användarbehörigheterna skapar du en webbsida med exempelkod som du kan använda för att visa, redigera, skapa och ta bort poster.

  1. I vänster fönster av programmet Portalhantering väljer du Webbsidor.

  2. Välj Nytt.

  3. I rutan Namn anger du Webb-API.

  4. I listan Webbplats väljer du din webbplatspost.

  5. För Överordnad sida väljer du Hem.

  6. För Partiell URL anger du webapi.

  7. För Sidmall väljer du Hem.

  8. För Publiceringstillstånd väljer du Publicerad.

  9. Välj Spara.

    Webbsida.

  10. Välj Relaterad > Webbsidor.

    Relaterade webbsidor

  11. Från associerad vyn webbsida väljer du webapi.

    Webbsida – associerad vy.

  12. Bläddra ned till avsnittet Innehåll och gå sedan till Kopiera (HTML) (HTML-designer).

    Kopiera HTML-innehåll

  13. Välj fliken HTML.

    Välj HTML-fliken

  14. Kopiera följande exempelkodavsnitt och klistra in det i HTML-designer.

        <!-- 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>
    

    Klistra in kod.

  15. Välj Spara och stäng.

Steg 4. Rensa portalens cacheminne

Du har skapat en webapi exempelsida där du kan testa webb-API-funktionerna. Innan du börjar ska du se till att Power Apps-portalens cacheminne har rensats så att ändringarna från programmet Portalhantering återspeglas på portalen.

VIKTIGT: Rensning av portalens cacheminne på serversidan orsakar tillfälliga prestandaproblem i portalen när data läses in på nytt från Microsoft Dataverse.

Rensa cacheminnet:

  1. Logga in på portalen som medlem i webbrollen Administratörer.

  2. Ändra URL genom att lägga till /_tjänster/om på slutet. Till exempel om portalens URL är  https://contoso.powerappsportals.com, ändra den till  https://contoso.powerappsportals.com/_services/about.

    Rensa cacheminnet.

    OBS! Du måste vara medlem i webbrollen Administratörer för att rensa cacheminnet. Om du ser en tom skärmbild kontrollerar du webbrollens tilldelningar.

  3. Välj Rensa cacheminne.

Mer information:  Rensa cacheminnet på serversidan för en portal

Steg 5. Med webb-API kan du läsa, visa, redigera, skapa och ta bort

Exempelwebbsidan med URL webbapi som skapades tidigare kan nu testas.

Så här testar du webb-API-funktioner:

  1. Logga in på portalen med användarkontot som har tilldelats rollen Webb-API-användare som du skapade tidigare.

  2. Gå till webbsidan för webbapi som skapades tidigare. Exempel: https://contoso.powerappsportals.com/webapi Webb-API hämtar poster från Microsoft Dataverse.

    Exempelwebbsida för webbapi.

  3. Välj Lägg till exempelpost om du vill lägga till exempelposten från skriptet.

  4. Välj ett fält. I det här exemplet har vi valt E-post för att ändra e-postadressen för en kontakt.

    Redigera e-post

  5. Välj knappen Ta bort för att ta bort en post.

Nu när du har skapat en webbsida med ett exempel för att läsa, redigera, skapa och ta bort poster kan du anpassa formulären och layouten.

Nästa steg

Komponera HTTP-begäranden och hantera fel

Se även

Översikt över webb-API-portaler
Portaler skriver, uppdaterar och tar bort åtgärder med hjälp av webb-API
Portaler läser åtgärder med hjälp av webb-API
Konfigurera kolumnbehörigheter

Anteckning

Kan du berätta om dina inställningar för dokumentationsspråk? Svara i en kort undersökning. (observera att undersökningen är på engelska)

Undersökningen tar ungefär sju minuter. Inga personuppgifter samlas in (sekretesspolicy).