แชร์ผ่าน


บทช่วยสอน: ใช้ Web API ของพอร์ทัล

หมายเหตุ

พอร์ทัล Power Apps คือ Power Pages โดยมีผลในวันที่ 12 ตุลาคม 2022 ข้อมูลเพิ่มเติม: Microsoft Power Pages มีให้ใช้งานทั่วไป (บล็อก)
ในไม่ช้าเราจะย้ายและรวมคู่มือพอร์ทัล Power Apps เข้ากับ คู่มือ Power Pages

ในบทช่วยสอนนี้ คุณจะตั้งค่าหน้าเว็บและเทมเพลตเว็บที่กำหนดเองซึ่งจะใช้ Web API เพื่ออ่าน, เขียน, อัปเดต, และลบเรกคอร์ดจากตารางผู้ติดต่อ

หมายเหตุ

คุณสามารถเปลี่ยนชื่อคอลัมน์ หรือใช้ตารางอื่น ในขณะที่ทำตามขั้นตอนในตัวอย่างนี้

ขั้นตอนที่ 1 สร้างการตั้งค่าไซต์

ก่อนที่คุณจะสามารถใช้ Web API ของพอร์ทัล คุณต้องเปิดใช้งานการตั้งค่าไซต์ที่จำเป็นด้วยแอปการจัดการพอร์ทัล การตั้งค่าไซต์ขึ้นอยู่กับตารางที่คุณต้องการใช้เมื่อโต้ตอบกับ API สำหรับเว็บ

  1. ไปที่  Power Apps

  2. บนบานหน้าต่างด้านซ้าย เลือก แอป

  3. เลือกแอป การจัดการพอร์ทัล 

    เปิดใช้งานแอปการจัดการพอร์ทัล

  4. บนบานหน้าต่างด้านซ้ายของแอป  Portal Management  เลือก  การตั้งค่าไซต์

    เปิดการตั้งค่าไซต์ในแอป Portal Management

  5. เลือก  สร้าง

  6. ในกล่อง  ชื่อ  ให้ป้อน  Webapi/contact/enabled

  7. ในรายการ  เว็บไซต์  เลือกเรกคอร์ดเว็บไซต์ของคุณ

  8. ในกล่อง  ค่า  ป้อน  จริง

    เปิดใช้งานตารางผู้ติดต่อสำหรับการตั้งค่าไซต์ WebAPI

  9. เลือก  บันทึกและปิด

  10. เลือก  สร้าง

  11. ในกล่อง  ชื่อ  ให้ป้อน  Webapi/contact/fields

  12. ในรายการ  เว็บไซต์  เลือกเรกคอร์ดเว็บไซต์ของคุณ

  13. ในกล่อง  ค่า  ป้อน
    ชื่อ,นามสกุล,ชื่อเต็ม,ที่อยู่อีเมล1,โทรศัพท์1

    เปิดใช้งานการตั้งค่าไซต์ของฟิลด์ตารางผู้ติดต่อสำหรับ WebAPI

  14. เลือก  บันทึกและปิด

  15. เลือก  สร้าง

  16. ในกล่อง  ชื่อ  ให้ป้อน  Webapi/error/innererror

    เปิดใช้งานการตั้งค่าไซต์ข้อผิดพลาดภายในของ Web API

  17. ในรายการ  เว็บไซต์  เลือกเรกคอร์ดเว็บไซต์ของคุณ

  18. ในกล่อง  ค่า  ป้อน  จริง

  19. เลือก  บันทึกและปิด

  20. ตรวจสอบการตั้งค่าไซต์สำหรับ  Web API

ขั้นตอนที่ 2 ตั้งค่าคอนฟิกสิทธิ์

คุณจะต้องกำหนดค่าสิทธิ์ เพื่อให้ผู้ใช้สามารถใช้คุณลักษณะ Web API ได้ ในตัวอย่างนี้ คุณจะเปิดใช้งานตาราง ผู้ติดต่อ สำหรับสิทธิ์อนุญาตใช้ตาราง, สร้างบทบาทเว็บโดยใช้ Web API, เพิ่มสิทธิ์อนุญาตใช้ตารางสำหรับตาราง ผู้ติดต่อ ให้กับบทบาทเว็บนี้ แล้วจากนั้น เพิ่มบทบาทเว็บให้กับผู้ใช้เพื่ออนุญาตให้พวกเขาใช้ Web API

  1. บนบานหน้าต่างด้านซ้ายของแอป  Portal Management  เลือก  สิทธิ์อนุญาตใช้ตาราง

  2. เลือก  สร้าง

  3. ในกล่อง  ชื่อ  ให้ป้อน  สิทธิ์ตารางผู้ติดต่อ

  4. ในรายการ  ชื่อตาราง  เลือก  ผู้ติดต่อ (ผู้ติดต่อ)

  5. ในรายการ  เว็บไซต์  เลือกเรกคอร์ดเว็บไซต์ของคุณ

  6. ในรายการ ชนิดการเข้าถึง  เลือก ส่วนกลาง

  7. เลือกสิทธิ์การใช้งาน อ่าน เขียน สร้าง และ ลบ

  8. เลือก  บันทึกและปิด

    สิทธิ์อนุญาตใช้ตารางของผู้ติดต่อ

สร้างบทบาทเว็บ

คุณสามารถใช้บทบาทเว็บที่มีอยู่ในเว็บไซต์ของคุณหรือสร้างบทบาทเว็บใหม่

  1. บนบานหน้าต่างด้านซ้าย เลือก บทบาทเว็บ 

  2. เลือก  สร้าง

  3. ในกล่อง ชื่อ  ป้อน ผู้ใช้ Web API (หรือชื่อใดๆ ที่สะท้อนถึงบทบาทของผู้ใช้ที่เข้าถึงฟังก์ชันนี้ได้ดีที่สุด)

  4. ในรายการ  เว็บไซต์  เลือกเรกคอร์ดเว็บไซต์ของคุณ

    เพิ่มบทบาทเว็บของผู้ใช้ Web API

  5. เลือก บันทึก

เพิ่มสิทธิ์ของตารางที่เกี่ยวข้อง

  1. ด้วยบทบาทเว็บใหม่หรือที่มีอยู่ ให้เลือก t ที่เกี่ยวข้อง > สิทธิ์ของตาราง

    เพิ่มสิทธิ์อนุญาตใช้ตารางที่เกี่ยวข้องไปยังบทบาทเว็บ

  2. เลือก เพิ่มสิทธิ์ตารางที่มีอยู่

  3. เลือก สิทธิ์ตารางผู้ติดต่อ ที่สร้างขึ้นก่อนหน้านี้

    เลือกสิทธิ์อนุญาตใช้ตารางของผู้ติดต่อ

  4. เลือก เพิ่ม

  5. เลือก  บันทึกและปิด

    มุมมองสิทธิ์อนุญาตใช้ตาราง

เพิ่มผู้ติดต่อในบทบาทเว็บ

  1. บนบานหน้าต่างด้านซ้าย เลือก ผู้ติดต่อ

  2. ให้เลือกผู้ติดต่อที่คุณต้องการใช้ในตัวอย่างนี้สำหรับ Web API

    หมายเหตุ

    ผู้ติดต่อนี้เป็นลูบัญชีผู้ใช้ที่ใช้ในตัวอย่างนี้เพื่อทดสอบ Web API อย่าลืมเลือกผู้ติดต่อที่ถูกต้องในพอร์ทัลของคุณ

  3. เลือก ที่เกี่ยวข้อง > บทบาทเว็บ

    การเลือกบทบาทเว็บที่เกี่ยวข้อง

  4. เลือก เพิ่มบทบาทเว็บที่มีอยู่

  5. เลือกบทบาท ผู้ใช้ Web API  ที่สร้างขึ้นก่อนหน้านี้

  6. เลือก เพิ่ม

    มุมมองที่เกี่ยวข้องของบทบาทเว็บ

  7. เลือก  บันทึกและปิด

ขั้นตอนที่ 3 สร้างเว็บเพจ

เมื่อคุณได้เปิดใช้งาน Web API และกำหนดค่าสิทธิ์ของผู้ใช้แล้ว ให้สร้างเว็บเพจที่มีรหัสตัวอย่างเพื่อดู แก้ไข สร้าง และลบเรกคอร์ด

  1. บนบานหน้าต่างด้านซ้ายของแอป  Portal Management  เลือก เว็บเพจ

  2. เลือก สร้าง

  3. ในกล่อง ชื่อ ให้ป้อน webapi

  4. ในรายการ เว็บไซต์ เลือกเรกคอร์ดเว็บไซต์ของคุณ

  5. สำหรับ เพจหลัก เลือก หน้าแรก

  6. สำหรับ URL บางส่วน ป้อน webapi

  7. สำหรับ เทมเพลตเพจ เลือก หน้าแรก

  8. สำหรับ สถานะการเผยแพร่ ให้เลือก เผยแพร่แล้ว

  9. เลือก บันทึก

    เว็บเพจ

  10. เลือก ที่เกี่ยวข้อง > เว็บเพจ

    เว็บเพจที่เกี่ยวข้อง

  11. จาก มุมมองที่เกี่ยวข้องกับเว็บเพจ เลือก webapi

    มุมมองร่วมของเว็บเพจ

  12. เลื่อนลงไปที่ส่วน เนื้อหา แล้วจากนั้น ไปที่ คัดลอก (HTML) (ตัวออกแบบ HTML)

    คัดลอกเนื้อหา HTML

  13. เลือกแท็บ HTML

    เลือกแท็บ HTML

  14. คัดลอกส่วนย่อยของโค้ดตัวอย่างต่อไปนี้ และวางลงในตัวออกแบบ 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>
    

    วางรหัส

  15. เลือก บันทึกและปิด

ขั้นตอนที่ 4 ล้างแคชของพอร์ทัล

คุณได้สร้างหน้าตัวอย่าง webapi  เพื่อทดสอบการทำงานของ Web API ก่อนที่คุณจะเริ่มต้นใช้งาน ตรวจสอบให้แน่ใจว่าแคชพอร์ทัล Power Apps ถูกล้าง เพื่อให้การเปลี่ยนแปลงจากแอปการจัดการพอร์ทัลแสดงบนพอร์ทัลของคุณ

สำคัญ: การล้างแคชฝั่งเซิร์ฟเวอร์พอร์ทัลจะทำให้เกิดการลดประสิทธิภาพการทำงานชั่วคราวของพอร์ทัล ในขณะที่ข้อมูลถูกโหลดใหม่จาก Microsoft Dataverse

หากต้องการล้างแคช:

  1. ลงชื่อเข้าใช้พอร์ทัลของคุณในฐานะสมาชิกของบทบาทเว็บของผู้ดูแลระบบ

  2. เปลี่ยน URL โดยการผนวก /_services/about ในตอนท้าย ตัวอย่างเช่น หาก URL พอร์ทัลคือ  https://contoso.powerappsportals.com เปลี่ยนเป็น  https://contoso.powerappsportals.com/_services/about

    ล้างแคช

    หมายเหตุ: คุณต้องเป็นสมาชิกของบทบาทเว็บ ผู้ดูแลระบบ เพื่อล้างแคช หากคุณเห็นหน้าจอว่างเปล่า ให้ตรวจสอบการกำหนดบทบาทเว็บ

  3. เลือก ล้างแคช

ข้อมูลเพิ่มเติม:  ล้างแคชฝั่งเซิร์ฟเวอร์สำหรับพอร์ทัล

ขั้นตอนที่ 5 ใช้ Web API เพื่ออ่าน, ดู, แก้ไข, สร้าง, และลบ

เว็บเพจตัวอย่างที่มี URL webapi ที่สร้างก่อนหน้านี้พร้อมสำหรับการทดสอบแล้ว

วิธีทดสอบการทำงานของ Web API:

  1. เข้าสู่ระบบพอร์ทัลของคุณด้วยบัญชีผู้ใช้ที่ได้รับมอบหมายบทบาท ผู้ใช้ Web API ที่คุณสร้างไว้ก่อนหน้านี้

  2. ไปที่เว็บเพจ webapi ที่สร้างขึ้นก่อนหน้านี้ ตัวอย่างเช่น: https://contoso.powerappsportals.com/webapi WebAPI จะดึงข้อมูลเรกคอร์ดจาก Microsoft Dataverse

    เว็บเพจ webapi ตัวอย่าง

  3. เลือก เพิ่มเรกคอร์ดตัวอย่าง เพื่อเพิ่มเรกคอร์ดตัวอย่างจากสคริปต์

  4. เลือกฟิลด์ ในตัวอย่างนี้ เราได้เลือก อีเมล เพื่อเปลี่ยนที่อยู่อีเมลของผู้ติดต่อ

    แก้ไขอีเมล

  5. เลือก ปุ่มลบ เพื่อลบเรกคอร์ด

เมื่อคุณได้สร้างเว็บเพจที่มีตัวอย่างเพื่ออ่าน, แก้ไข, สร้าง, และลบเรกคอร์ดแล้ว คุณสามารถกำหนดฟอร์มและเค้าโครงเองได้

ขั้นตอนถัดไป

เขียนคำขอ HTTP และจัดการข้อผิดพลาด

ดูเพิ่มเติม

ภาพรวมของ API เว็บของพอร์ทัล
พอร์ทัลเขียน, ปรับปรุง, และลบการดำเนินงานโดยใช้ Web API
พอร์ทัลอ่านการดำเนินการโดยใช้ Web API
กำหนดค่าสิทธิ์ของคอลัมน์

หมายเหตุ

บอกให้เราทราบเกี่ยวกับภาษาที่คุณต้องการในคู่มือ ทำแบบสำรวจสั้นๆ (โปรดทราบว่าแบบสำรวจนี้เป็นภาษาอังกฤษ)

แบบสำรวจนี้ใช้เวลาทำประมาณเจ็ดนาที ไม่มีการเก็บข้อมูลส่วนบุคคล (คำชี้แจงสิทธิ์ส่วนบุคคล)