Bagikan melalui


Tutorial: Menggunakan API Web portal

Catatan

Mulai 12 Oktober 2022, portal Power Apps menjadi Power Pages. Informasi selengkapnya: Microsoft Power Pages kini tersedia secara umum (blog)
Kami akan segera memigrasikan dan menggabungkan dokumentasi portal Power Apps dengan dokumentasi Power Pages.

Dalam tutorial ini, Anda akan mengkonfigurasi halaman web dan template web kustom yang akan menggunakan API Web untuk membaca, menulis, memperbarui, dan menghapus rekaman dari tabel kontak.

Catatan

Anda dapat mengubah nama kolom, atau menggunakan tabel yang berbeda saat mengikuti langkah dalam contoh ini.

Langkah 1. Buat Pengaturan Situs

Agar dapat menggunakan web API portal, Anda harus mengaktifkan pengaturan situs yang diperlukan dengan aplikasi manajemen portal. Pengaturan situs tergantung pada tabel yang ingin Anda gunakan saat berinteraksi dengan API Web.

  1. Pergi ke Power Apps.

  2. Di panel kiri, pilih Aplikasi.

  3.  Pilih aplikasi Manajemen Portal.

    Luncurkan aplikasi Portal Management.

  4. Di panel kiri aplikasi Manajemen Portal, pilih Pengaturan Situs.

    buka pengaturan situs di aplikasi Portal Management.

  5. Pilih Baru.

  6.  Dalam kotak Nama , masukkan Webapi/contact/enabled.

  7. Di daftar Situs web, pilih rekaman situs web Anda.

  8.  Dalam kotak Nilai , masukkan true.

    Aktifkan tabel kontak untuk pengaturan situs WebAPI.

  9. Pilih Simpan & Tutup.

  10. Pilih Baru.

  11.  Dalam kotak Nama , masukkan Webapi/contact/fields.

  12. Di daftar Situs web, pilih rekaman situs web Anda.

  13.  Dalam kotak Nilai , masukkan
    firstname,lastname,fullname,emailaddress1,telephone1

    Aktifkan pengaturan situs bidang tabel kontak WebAPI.

  14. Pilih Simpan & Tutup.

  15. Pilih Baru.

  16.  Di kotak Nama , masukkan Webapi/error/innererror.

    Aktifkan pengaturan situs kesalahan dalam API Web.

  17. Di daftar Situs web, pilih rekaman situs web Anda.

  18.  Dalam kotak Nilai , masukkan true.

  19. Pilih Simpan & Tutup.

  20. Verifikasi pengaturan situs untuk Web API.

Langkah 2. Konfigurasikan izin

Anda harus mengkonfigurasi izin sehingga pengguna dapat menggunakan fitur web API. Dalam contoh ini, Anda akan mengaktifkan tabel Kontak untuk izin tabel, membuat peran web untuk menggunakan API Web, menambahkan izin tabel untuk tabel Kontak ke peran web ini, lalu menambahkan peran web ke pengguna agar dapat menggunakan API Web.

  1. Di panel kiri aplikasi Manajemen Portal, pilih Izin Tabel.

  2. Pilih Baru.

  3.  Dalam kotak Nama , masukkan Izin Tabel Kontak.

  4.  Di daftar Nama Tabel, pilih Kontak (kontak).

  5. Di daftar Situs web, pilih rekaman situs web Anda.

  6.  Di daftar Tipe Akses, pilih Global.

  7. Pilih Hak istimewa Baca, Tulis, buat, dan Hapus.

  8. Pilih Simpan & Tutup.

    Izin Tabel Kontak.

Membuat peran web

Anda dapat menggunakan peran web yang ada di situs web atau membuat peran web baru.

  1. Di panel kiri, pilih Peran  Web.

  2. Pilih Baru.

  3.  Dalam kotak Nama , masukkan Pengguna API Web(atau nama apa pun yang paling mencerminkan peran pengguna yang mengakses fungsi ini).

  4. Di daftar Situs web, pilih rekaman situs web Anda.

    Tambahkan Peran Web Pengguna API Web.

  5. Pilih Simpan.

Tambahkan Izin Tabel terkait

  1. Dengan peran web baru atau yang sudah ada, pilih Izin Tabel Terkait > ****.

    Tambahkan Izin tabel terkait ke Peran Web.

  2. Pilih Tambahkan Izin Tabel yang Sudah Ada.

  3. Pilih Izin Tabel Kontak, dibuat sebelumnya.

    Pilih Izin Tabel Kontak.

  4. Pilih Tambahkan.

  5. Pilih Simpan & Tutup.

    Lihat tampilan Izin tabel.

Menambahkan kontak ke peran web

  1. Di panel kiri, pilih Kontak.

  2. Pilih kontak yang akan digunakan dalam contoh ini untuk web API.

    Catatan

    Kontak ini adalah akun pengguna yang digunakan dalam contoh ini untuk menguji web API. Pastikan untuk memilih kontak yang benar di portal Anda.

  3. Pilih Peran > Web Terkait.

    Memilih Peran Web terkait.

  4. Pilih Tambahkan Peran Web yang Ada.

  5. Pilih peran Pengguna API Web, yang dibuat sebelumnya.

  6. Pilih Tambahkan.

    Tampilan Terkait Peran Web.

  7. Pilih Simpan & Tutup.

Langkah 3. Buat halaman web

Setelah Anda mengaktifkan API web dan izin pengguna yang dikonfigurasi, buat halaman web dengan kode sampel untuk menampilkan, mengedit, membuat, dan menghapus rekaman.

  1. Di panel kiri aplikasi Manajemen Portal, pilih Halaman Web.

  2. Pilih baru.

  3. Di kotak nama, masukkan webapi.

  4. Dalam Daftar situs web, pilih rekaman situs web Anda.

  5. Untuk Halaman Induk: Pilih Beranda.

  6. Untuk URL parsial, masukkan webapi.

  7. Untuk Template Halaman: Pilih Beranda.

  8. Untuk Status Publikasi, pilih Dipublikasikan.

  9. Pilih Simpan.

    Halaman Web.

  10. Pilih Terkait > Halaman Web.

    Halaman Web Terkait

  11. Dari tampilan terkait halaman web, pilih webapi.

    Tampilan Terkait Halaman Web.

  12. Gulir ke bawah ke Bagian konten, lalu buka Salin (html) (Desainer HTML).

    Salin konten HTML

  13. Pilih tab HTML.

    Pilih tab HTML

  14. Salin contoh cuplikan kode berikut dan tempel ke Desainer 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>
    

    Tempelkan kode.

  15. Pilih Simpan & Tutup.

Langkah 4. Bersihkan cache portal

Anda telah membuat halaman sampel webapi untuk menguji fungsionalitas API Web. Sebelum memulai, pastikan cache portal Power Apps telah dibersihkan sehingga perubahan dari aplikasi manajemen portal tercermin di portal Anda.

PENTING: Mengosongkan cache sisi server portal akan sementara menyebabkan penurunan kinerja portal saat data dimuat dari Microsoft Dataverse.

Untuk menghapus cache:

  1. Masuk ke portal Anda sebagai anggota peran web administrator.

  2. Ubah URL dengan menambahkan /_ layanan/tentang di bagian akhir. Misalnya, jika URL https://contoso.powerappsportals.com portal, ubah menjadi https://contoso.powerappsportals.com/_services/about.

    Hapus cache.

    CATATAN: Anda harus menjadi anggota peran web Administrator untuk menghapus cache. Jika Anda melihat layar kosong, periksa penetapan peran web.

  3. Pilih Hapus cache.

Informasi selengkapnya: Menghapus cache sisi server untuk portal

Langkah 5. Menggunakan web API untuk membaca, menampilkan, mengedit, membuat, dan menghapus

Halaman web sampel dengan webapi URL yang dibuat sebelumnya sekarang siap untuk pengujian.

Untuk menguji fungsi web API:

  1. Masuk ke portal Anda dengan akun pengguna yang telah ditetapkan peran pengguna api web yang Anda buat sebelumnya.

  2. Buka halaman web webapi yang dibuat sebelumnya. Misalnya: https://contoso.powerappsportals.com/webapi. WebAPI akan mengambil rekaman dari Microsoft Dataverse.

    Contoh halaman web webapi.

  3. Pilih Tambah rekaman sampel untuk menambahkan rekaman sampel dari skrip.

  4. Pilih bidang. Dalam contoh ini, kami telah memilih email untuk mengubah alamat email kontak.

    Edit email

  5. Pilih tombol Hapus untuk menghapus rekaman.

Setelah membuat halaman web dengan sampel untuk membaca, mengedit, membuat, dan menghapus rekaman, Anda dapat menyesuaikan formulir dan tata letak.

Langkah selanjutnya

Menulis permintaan HTTP dan menangani kesalahan

Baca juga

Ikhtisar API Web portal
Operasi Menulis, Memperbarui dan menghapus portal dengan menggunakan Web API
Operasi baca portal menggunakan API Web
Mengonfigurasi izin kolom

Catatan

Apa bahasa dokumentasi yang Anda inginkan? Lakukan survei singkat. (perlu diketahui bahwa survei ini dalam bahasa Inggris)

Survei akan berlangsung kurang lebih selama tujuh menit. Tidak ada data pribadi yang dikumpulkan (pernyataan privasi).