Mokymo priemonė: portalo žiniatinklio API naudojimas

Pastaba

Nuo 2022 m. spalio 12 d. „Power Apps“ portalai tampa „Power Pages“. Daugiau informacijos: „Microsoft Power Pages“ dabar yra visuotinai prieinama (tinklaraštis)
Greitai perkelsime ir suliesime „Power Apps“ portalų dokumentaciją su „Power Pages“ dokumentacija.

Šioje mokymo priemonėje galite sukonfigūruoti tinklalapį ir pasirinktinį žiniatinklio šabloną, kuris naudos žiniatinklio API kontaktų lentelės įrašams skaityti, rašyti, naujinti ir naikinti.

Pastaba

Galite pakeisti stulpelių pavadinimus arba naudoti kitą lentelę atlikdami veiksmus šiame pavyzdyje.

1 veiksmas. Sukurkite svetainės parametrus

Prieš jums naudojant portalus žiniatinklio API, turite įjungti būtinus svetainės nustatymus portalo tvarkymo programoje. Svetainės parametrai priklauso nuo lentelės, kurią norite naudoti sąveikaudami su Žiniatinklio API.

  1. Eikite į  Power Apps.

  2. Kairiojoje srityje pasirinkite Programėlės.

  3. Pasirinkite portalo valdymo programą.

    Paleiskite Portalo valdymo programą.

  4. Kairiojoje portalo valdymo programos srityje pasirinkite Svetainės parametrai.

    Atidarykite svetainės parametrus Portalo valdymo programoje.

  5. Pasirinkite Naujas.

  6.  Lauke Pavadinimas įveskite Webapi/contact/enabled.

  7.  Sąraše Žiniatinklio svetainė pasirinkite žiniatinklio svetainės įrašą.

  8.  Lauke Reikšmė įveskite true.

    Įjunkite WebAPI svetainės parametro kontaktų lentelę.

  9. Pasirinkite Įrašyti ir uždaryti.

  10. Pasirinkite Naujas.

  11.  Lauke Pavadinimas įveskite Webapi/contact/fields.

  12.  Sąraše Žiniatinklio svetainė pasirinkite žiniatinklio svetainės įrašą.

  13.  Lauke Reikšmė įveskite
    vardas,pavardė,vardasirpavardė,el.paštoadresas1,telefonas1

    Įjunkite žiniatinklio API kontaktų lentelės laukų svetainės parametrą.

  14. Pasirinkite Įrašyti ir uždaryti.

  15. Pasirinkite Naujas.

  16.  Lauke Pavadinimas įveskite Webapi/error/innererror.

    Įjunkite žiniatinklio API vidinių klaidų svetainės parametrą.

  17.  Sąraše Žiniatinklio svetainė pasirinkite žiniatinklio svetainės įrašą.

  18.  Lauke Reikšmė įveskite true.

  19. Pasirinkite Įrašyti ir uždaryti.

  20. Patikrinkite žiniatinklio API svetainės parametrus.

2 veiksmas. Teisių konfigūravimas

Turite konfigūruoti leidimus tam, kad vartotojai galėtų naudoti žiniatinklio API funkciją. Šiame pavyzdyje įgalinsite Kontaktų lentelei skirtas teises, sukursite žiniatinklio vaidmenį naudodami žiniatinklio API, į šį žiniatinklio vaidmenį įtrauksite Kontaktų lentelės teises, o tada įtrauksite žiniatinklio vaidmenį vartotojams, kad jie galėtų naudoti žiniatinklio API.

  1. Kairiojoje portalo valdymo programos srityje pasirinkite Lentelės teisės.

  2. Pasirinkite Naujas.

  3.  Lauke Pavadinimas įveskite Kontaktų lentelės teisės.

  4.  Sąraše Lentelės pavadinimas pasirinkite Kontaktas (kontaktas).

  5.  Sąraše Žiniatinklio svetainė pasirinkite žiniatinklio svetainės įrašą.

  6.  Sąraše Prieigos tipas pasirinkite Visuotinis.

  7. Pasirinkite Skaityti, Rašyti, Kurti ir Naikinti teises.

  8. Pasirinkite Įrašyti ir uždaryti.

    Kontaktų lentelės teisės.

Žiniatinklio vaidmens kūrimas

Galite naudoti esamą žiniatinklio vaidmenį savo svetainėje arba sukurti naują žiniatinklio vaidmenį.

  1. Kairiojoje srityje pasirinkite Žiniatinklio vaidmenys .

  2. Pasirinkite Naujas.

  3.  Lauke Vardas įveskite žiniatinklio API vartotojas (arba bet koks vardas, geriausiai atspindintis vartotojo, pasiekiančio šią funkciją, vaidmenį).

  4.  Sąraše Žiniatinklio svetainė pasirinkite žiniatinklio svetainės įrašą.

    Įtraukite žiniatinklio API vartotojo žiniatinklio vaidmenį.

  5. Pasirinkite  Įrašyti.

  1. Naudodami naują arba esamą žiniatinklio vaidmenį, pasirinkite Susijusios > lentelės teisės.

    Įtraukite susijusias lentelės teises į žiniatinklio vaidmenį.

  2. Pasirinkite Pridėti esamas lentelės teises.

  3. Pasirinkite Kontaktų lentelės teises, sukurtas anksčiau.

    Pasirinkite kontaktų lentelės teisę.

  4. Pasirinkite Pridėti.

  5. Pasirinkite Įrašyti ir uždaryti.

    Lentelės teisių rodinys.

Kontaktų įtraukimas į žiniatinklio vaidmenį

  1. Kairiojoje srityje pasirinkite Kontaktai.

  2. Pasirinkite kontaktą, kurį norite naudoti šiame pavyzdyje žiniatinklio API.

    Pastaba

    Šis kontaktas yra vartotojo paskyra, naudojama šiame pavyzdyje žiniatinklio API bandymui. Įsitikinkite, kad pasirinkote tinkamą kontaktą savo portale.

  3. Pasirinkite Susiję > žiniatinklio vaidmenys.

    Susijusių žiniatinklio vaidmenų pasirinkimas.

  4. Pasirinkite Įtraukti esamą žiniatinklio vaidmenį.

  5.  Pasirinkite anksčiau sukurtą žiniatinklio API vartotojo vaidmenį.

  6. Pasirinkite Pridėti.

    Žiniatinklio vaidmens susietasis rodinys.

  7. Pasirinkite Įrašyti ir uždaryti.

3 veiksmas. Sukurkite žiniatinklio puslapį

Dabar, kai įjungėte žiniatinklio API ir sukonfigūravote vartotojo leidimus, sukurkite žiniatinklio puslapį su pavyzdžio kodu, skirtą peržiūrėti, redaguoti, kurti ir naikinti įrašus.

  1. Kairiojoje portalo valdymo programos srityje pasirinkite Tinklalapiai.

  2. Pasirinkite Nauja.

  3. Pavadinimas laukelyje įveskite Žiniatinklioapi.

  4. Žiniatinklio svetainės sąraše pasirinkite savo žiniatinklio svetainės įrašą.

  5. Vadovo puslapyje, pasirinkite Pagrindinis.

  6. Dalinis URL įveskite žiniatinklio api.

  7. Šablono puslapyje, pasirinkite Pagrindinis.

  8. Publikavimo valstybė pasirinkite Publikuota.

  9. Pasirinkite Įrašyti.

    Tinklalapis.

  10. Pasirinkite Susiję > Tinklalapiai.

    Susiję tinklalapiai

  11. Tinklalapio susietasis rodinys, pasirinkite webapi.

    Tinklalapių susietasis rodinys.

  12. Eikite žemyn iki Turinys skyriaus ir tuomet eikite į Kopijuoti (HTML) (HTML kūrėjas).

    HTML turinio kopijavimas

  13. Pažymėkite skirtuką HTML.

    Pasirinkite HTML skirtuką

  14. Nukopijuokite tolesnį pavyzdžio kodo nuokarpą ir įkelkite jį į HTML kūrėją.

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

    Įklijuokite kodą.

  15. Pasirinkite Įrašyti ir uždaryti.

4 veiksmas. Portalų talpyklos išvalymas

Sukūrėte webapi pavyzdinį puslapį, kad patikrintumėte žiniatinklio API funkcijas. Prieš pradėdami įsitikinkite, kad „Power Apps“ portalų talpykla buvo išvalyta tam, kad pakeitimai portalo tvarkymo programoje būtų įkelti į jūsų portalą.

SVARBU: dėl portalo serverio talpyklos valymo gali laikinai pablogėti portalo efektyvumas, kai duomenys iš naujo įkeliami iš „Microsoft Dataverse“.

Podėlio išvalymui:

  1. Prisijunkite prie savo portalo kaip administratoriaus tinklo vaidmens narys.

  2. Pakeiskite URL pabaigoje pridėdami /_ paslaugas / apie . Pavyzdžiui, jei portalo URL yra  https://contoso.powerappsportals.com, pakeiskite jį į  https://contoso.powerappsportals.com/_services/about.

    Išvalykite podėlį.

    PASTABA: Norėdami išvalyti talpyklą, turite būti žiniatinklio vaidmens administratorių narys . Jei matote tuščią langą, patikrinkite tinklo vaidmens priskyrimus.

  3. Pasirinkite Išvalyti talpyklą.

Daugiau informacijos:  Valyti serverio pusės talpyklą portalui

5 veiksmas. Žiniatinklio API naudojimas norint redaguoti, peržiūrėti, kurti ir naikinti

Anksčiau sukurtas pavyzdinis tinklalapis su URL webapi dabar yra paruoštas išbandyti.

Norėdami išbandyti žiniatinklio API funkciją:

  1. Prisijunkite prie savo portalo su vartotojo paskyra, kuri buvo priskirta Žiniatinklio API vartotojo vaidmeniui, kurį sukūrėte anksčiau.

  2. Eikite į anksčiau sukurtą žiniatinklio api žiniatinklio puslapį. Pavyzdžiui, https://contoso.powerappsportals.com/webapi. WebAPI nuskaitys įrašus iš „Microsoft Dataverse“.

    Žiniatinklio api žiniatinklio puslapio pavyzdys.

  3. Pasirinkite Įtraukti įrašo pavyzdį norėdami į scenarijų įtraukti įrašo pavyzdį.

  4. Pasirinkite laukelį. Šiame pavyzdyje pasirinkome El.paštas tam, kad pakeistumėme kontaktinio el. pašto adresą.

    Redaguoti el. paštą

  5. Pasirinkite mygtuką Naikinti norėdami panaikinti įrašą.

Dabar, kai sukūrėte tinklalapį su pavyzdžiu norėdami skaityti, redaguoti, kurti ir naikinti įrašus, galite tinkinti formas ir maketą.

Tolesnis veiksmas

HTTP užklausų kūrimas ir klaidų taisymas

Taip pat žr.

Portalų žiniatinklio API apžvalga
Portalų rašymo, naujinimo ir naikinimo operacijos su žiniatinklio API
Portalų skaitymo operacijos naudojant žiniatinklio API
Stulpelių teisių konfigūravimas

Pastaba

Ar galite mums pranešti apie dokumentacijos kalbos nuostatas? Atlikite trumpą apklausą. (atkreipkite dėmesį, kad ši apklausa yra anglų kalba)

Apklausą atliksite per maždaug septynias minutes. Asmeniniai duomenys nėra renkami (privatumo nuostatos).