Samouczek: Używanie internetowego interfejsu API portali

Uwaga

12 października 2022 r. funkcja Portale usługi Power Apps została przekształcona w usługę Power Pages. Więcej informacji: Usługa Microsoft Power Pages jest teraz ogólnie dostępna (blog)
Wkrótce zmigrujemy i scalimy dokumentację funkcji Portale usługi Power Apps z dokumentacją usługi Power Pages.

W tym samouczku skonfigurujesz stronę internetową i niestandardowy szablon sieci Web, które będą używać internetowego interfejsu API do odczytywania, pisania, aktualizowania i usuwania rekordów z tabeli kontaktów.

Uwaga

Możesz zmienić nazwy kolumn lub użyć innej tabeli, wykonując kroki opisane w tym przykładzie.

Krok 1. Ustawienia Utwórz witrynę

Zanim będzie można korzystać z interfejsu API sieci Web Portales, konieczne jest włączenie wymaganych ustawień witryny w aplikacji Zarządzanie portalami. Ustawienia witryny zależą od tabeli, której chcesz użyć podczas współpracy z interfejsem API sieci Web.

  1. Przejdź do  Power Apps.

  2. W lewym okienku wybierz pozycję Aplikacje.

  3. Wybierz Zarządzanie portalem (aplikacja).

    Uruchom aplikację do zarządzania portalem.

  4. W lewym okienku aplikacji Zarządzanie portalem wybierz pozycję Ustawienia witryny.

    Otwórz ustawienia witryny w aplikacji Zarządzanie portalem.

  5. Wybierz  Nowy.

  6. W polu Nazwa wprowadź Webapi/contact/enabled.

  7. Z listy Witryna internetowa wybierz rekord witryny internetowej.

  8. W polu Wartość wprowadź true.

    Włącz tabelę kontaktów dla ustawień witryny WebAPI.

  9. Zaznacz  Zapisz i zamknij.

  10. Wybierz  Nowy.

  11. W polu Nazwa wprowadź Webapi/contact/fields.

  12. Z listy Witryna internetowa wybierz rekord witryny internetowej.

  13. W polu Wartość wprowadź
    firstname,lastname,fullname,emailaddress1,telephone1

    Włącz ustawienie witryny pól tabeli kontaktów interfejsu Web API.

  14. Zaznacz  Zapisz i zamknij.

  15. Wybierz  Nowy.

  16. W polu Nazwa wprowadź Webapi/error/innererror.

    Włącz ustawienie wewnętrznej witryny błędu interfejsu API sieci Web.

  17. Z listy Witryna internetowa wybierz rekord witryny internetowej.

  18. W polu Wartość wprowadź true.

  19. Zaznacz  Zapisz i zamknij.

  20. Sprawdź ustawienia witryny dotyczące internetowego interfejsu API.

Krok 2. Konfiguracja uprawnień

Użytkownik musi skonfigurować uprawnienia, aby użytkownicy mogli korzystać z funkcji Web API. W tym przykładzie włączysz tabelę Kontakt dla uprawnień do tabeli, utworzysz rolę sieci Web przy użyciu internetowego interfejsu API, dodasz uprawnienia do tabeli Kontakt do tej roli sieci Web, a następnie dodasz rolę sieci Web do użytkowników, aby umożliwić im korzystanie z internetowego interfejsu API.

  1. W lewym okienku aplikacji Zarządzanie portalem wybierz pozycję Uprawnienia do tabeli.

  2. Wybierz  Nowy.

  3. W polu Nazwa wprowadź Uprawnienie do tabeli kontaktów.

  4. Z listy Nazwa tabeli wybierz pozycję Kontakt (kontakt).

  5. Z listy Witryna internetowa wybierz rekord witryny internetowej.

  6. Z listy Tryb dostępu wybierz Globalny.

  7. Wybeirz uprawnienia Odczyt, Zapisz, Tworzenie i Usuwanie.

  8. Zaznacz  Zapisz i zamknij.

    Aktywne uprawnienia do tabeli.

Utwórz rolę rolę sieci Web

Użytkownik może użyć istniejącej roli sieci Web w witrynie sieci Web lub utworzyć nową rolę sieci Web.

  1. W lewym okienku wybierz Role internetowe .

  2. Wybierz  Nowy.

  3. W polu Nazwa wprowadź Użytkownik internetowego interfejsu API (lub dowolną nazwę, która w najlepszy sposób odzwierciedla rolę użytkownika uzyskującego dostęp do tej funkcji).

  4. Z listy Witryna internetowa wybierz rekord witryny internetowej.

    Dodaj rolę sieci Web użytkownika interfejsu API sieci Web.

  5. Wybierz  Zapisz.

Dodaj powiązane uprawnienia do tabeli

  1. Dla nowej lub istniejącej roli internetowej wybierz pozycję Pokrewne > Uprawnienia do tabel.

    Dodaj powiązane uprawnienia do tabeli do roli internetowej.

  2. Wybierz opcję Dodaj istniejące uprawnienie do tabeli.

  3. Wybierz opcję Uprawnienie do tabeli kontaktów, utworzone wcześniej.

    Wybierz uprawnienia do tabeli kontaktów.

  4. Wybierz Dodaj.

  5. Zaznacz  Zapisz i zamknij.

    Widok Uprawnienia do tabeli

Dodawanie kontaktów do roli sieci Web

  1. W lewym okienku wybierz Kontakty.

  2. Wybierz kontakt, którego chcesz użyć w tym przykładzie dla internetowego interfejsu API.

    Uwaga

    Ten kontakt jest kontem użytkownika użytym w tym przykładzie przy testowaniu internetowego interfejsu API. Upewnij się, że wybrano poprawny kontakt w portalu.

  3. Wybierz Powiązane > Role internetowe.

    Wybór powiązanych ról internetowych.

  4. Wybierz Dodaj istniejącą rolę internetową.

  5. Wybierz rolę Użytkownik internetowego interfejsu API utworzoną wcześniej.

  6. Wybierz Dodaj.

    Widok powiązany z rolą internetową.

  7. Zaznacz  Zapisz i zamknij.

Krok 3. Tworzenie strony internetowej

Po włączeniu interfejsu API sieci Web i skonfigurowanych uprawnień użytkowników utwórz stronę z przykładowym kodem w celu wyświetlenia, edycji, tworzenia i usuwania rekordów.

  1. W lewym okienku aplikacji Zarządzanie portalem wybierz pozycję Strony internetowe.

  2. Wybierz Nowy.

  3. W polu Nazwa wprowadź nazwę webapi.

  4. Z listy witryna sieci Web wybierz rekord witryny sieci Web.

  5. DLa Strona nadrzędna wybierz Strona główna.

  6. W przypadku Częściowego adresu URL wprowadź webapi.

  7. DLa Szablon strony wybierz Strona główna.

  8. Dla Stan publikowania wybierz Opublikowano.

  9. Wybierz pozycję Zapisz.

    Strona internetowa.

  10. Wybierz Powiązane > Strony sieci Web.

    Powiązane strony internetowe

  11. W Widok skojarzony strony internetowej wybierz opcję webapi.

    Widok skojarzony strony internetowej.

  12. Przewiń w dół do sekcji Zawartość, a następnie przejdź do opcji Kopiuj (HTML) (projektant HTML).

    Skopiuj zawartość HTML

  13. Wybierz kartę HTML.

    Wybierz kartę HTML

  14. Skopiuj poniższy przykładowy fragment kodu i wklej go do projektanta 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>
    

    Wklej kod.

  15. Zaznacz Zapisz i zamknij.

Krok 4. Czyszczenie pamięci podręcznej portali

Utworzono przykładową stronę webapi w celu przetestowania funkcjonalności internetowego interfejsu API. Przed rozpoczęciem pracy należy upewnić się, że pamięć podręczna Portali Power Apps została wyczyszczona, dzięki czemu zmiany z aplikacji Zarządzanie portalem są odzwierciedlane w portalu.

WAŻNE: Wyczyszczenie pamięci podręcznej po stronie serwera portalu powoduje tymczasowe pogorszenie wydajności portalu podczas ponownego ładowania danych z Microsoft Dataverse.

Aby wyczyścić pamięć podręczną:

  1. Zaloguj się do portalu jako członek roli sieci Web Administratorzy.

  2. Zmień adres URL, dołączając /_‑services/about na końcu. Na przykład w przypadku adresu URL portalu  https://contoso.powerappsportals.com zmień go na  https://contoso.powerappsportals.com/_services/about.

    Czyszczenie pamięci podręcznej.

    UWAGA: musisz być członkiem roli internetowej Administratorzy, aby wyczyścić pamięć podręczną. Jeśli widzisz pusty ekran, sprawdź przydziały ról sieci Web.

  3. Wybierz pozycję Wyczyść pamięć podręczną.

Więcej informacjiL  Wyczyść pamięć podręczną po stronie serwera dla portalu

Krok 5. Używanie internetowego interfejsu API do odczytywania, wyświetlania, edytowania, tworzenia i usuwania

Przykładowa strona internetowa z utworzonym wcześniej adresem URL webapi jest teraz gotowa do testowania.

Aby przetestować funkcjonalność sieci Web interfejsu API:

  1. Zaloguj się do portalu przy użyciu konta użytkownika, któremu została przypisana wcześniej rola Użytkownika interfejsu API sieci Web.

  2. Przejdź do strony webapi, która została utworzona wcześniej. Na przykład https://contoso.powerappsportals.com/webapi. Interfejs WebAPI pobierze rekordy z programu Microsoft Dataverse.

    Przykładowa strona sieci Web WebApi.

  3. Wybierz pozycję Dodaj Przykładowy rekord, aby dodać przykładowy rekord na skrypcie.

  4. Wybierz pole. W tym przykładzie wybrano opcję Poczta e-mail w celu zmiany adresu e-mail kontaktu.

    Edytuj wiadomość e-mail

  5. Wybierz przycisk Usuń , aby usunąć rekord.

Teraz, po utworzeniu strony internetowej z próbką do czytania, edytowania, tworzenia i usuwania rekordów, możesz dostosować formularze i układ.

Następny krok

Tworzenie żądań HTTP i obsługa błędów

Zobacz też

Opis internetowego interfejsu API portali
Portale zapisują, aktualizują i usuwają operacje za pomocą Web API
Portale odczytuje operacje przy użyciu internetowego interfejsu API
Konfiguruj uprawnienia kolumn

Uwaga

Czy możesz poinformować nas o preferencjach dotyczących języka dokumentacji? Wypełnij krótką ankietę. (zauważ, że ta ankieta jest po angielsku)

Ankieta zajmie około siedmiu minut. Nie są zbierane żadne dane osobowe (oświadczenie o ochronie prywatności).