Chia sẻ qua


Hướng dẫn: Sử dụng API web cổng thông tin

Lưu ý

Từ ngày 12 tháng 10 năm 2022, cổng thông tin Power Apps sẽ trở thành Power Pages. Thông tin khác: Microsoft Power Pages hiện đã được phát hành rộng rãi (blog)
Chúng tôi sẽ sớm di chuyển và hợp nhất hướng dẫn sử dụng cổng thông tin Power Apps với hướng dẫn sử dụng Power Pages.

Trong hướng dẫn này, bạn sẽ thiết lập một trang web và mẫu web tùy chỉnh, trong đó sử dụng API web để đọc, ghi, cập nhật và xóa các bản ghi khỏi bảng liên hệ.

Lưu ý

Bạn có thể thay đổi tên cột hoặc sử dụng một bảng khác trong khi làm theo các bước trong ví dụ này.

Bước 1. Tạo thiết đặt site

Trước khi có thể sử dụng API Web cổng thông tin, bạn phải bật thiết đặt trang web cần thiết với ứng dụng Quản lý cổng thông tin. Các mục thiết đặt trang web phụ thuộc vào bảng mà bạn muốn sử dụng khi tương tác với API web.

  1. Đi đến Power Apps.

  2. Ở ngăn bên trái, chọn Ứng dụng.

  3. Chọn ứng dụng Quản lý cổng thông tin .

    Chạy ứng dụng Quản lý cổng thông tin.

  4. Trên ngăn bên trái của ứng dụng Quản lý cổng thông tin , hãy chọn Cài đặt trang.

    Mở phần thiết đặt trang web trong ứng dụng Quản lý cổng thông tin

  5. Chọn Mới.

  6. Trong hộp Tên , nhập Webapi/contact/enabled.

  7. Trong danh sách Trang web , hãy chọn bản ghi trang web của bạn.

  8. Trong hộp Giá trị , nhập true.

    Bật bảng liên hệ cho cài đặt trang WebAPI.

  9. Chọn Lưu & Đóng.

  10. Chọn Mới.

  11. Trong hộp Tên , hãy nhập Webapi/contact/fields.

  12. Trong danh sách Trang web , hãy chọn bản ghi trang web của bạn.

  13. Trong hộp Giá trị , hãy nhập
    firstname,lastname,fullname,emailaddress1,telephone1

    Bật API web cho cài đặt trang trường bảng liên hệ.

  14. Chọn Lưu & Đóng.

  15. Chọn Mới.

  16. Trong hộp Tên , hãy nhập Webapi/error/innererror.

    Bật cài đặt trang lỗi bên trong API web.

  17. Trong danh sách Trang web , hãy chọn bản ghi trang web của bạn.

  18. Trong hộp Giá trị , nhập true.

  19. Chọn Lưu & Đóng.

  20. Xác minh cài đặt trang web cho API Web.

Bước 2. Đặt cấu hình quyền

Bạn sẽ phải định cấu hình quyền để người dùng có thể sử dụng tính năng API Web. Trong ví dụ này, bạn sẽ kích hoạt bảng Người liên hệ cho quyền đối với bảng, tạo vai trò web để sử dụng API web, thêm quyền đối với bảng cho bảng Người liên hệ vào vai trò web này, rồi thêm vai trò web cho người dùng để cho phép họ sử dụng API web.

  1. Trên ngăn bên trái của ứng dụng Quản lý cổng thông tin , chọn Quyền bảng.

  2. Chọn Mới.

  3. Trong hộp Tên , nhập Quyền bảng liên hệ.

  4. Trong danh sách Tên bảng , hãy chọn Liên hệ (liên hệ).

  5. Trong danh sách Trang web , hãy chọn bản ghi trang web của bạn.

  6. Trong danh sách Loại truy cập , chọn Chung.

  7. Chọn quyền Đọc, Ghi, TạoXóa.

  8. Chọn Lưu & Đóng.

    Quyền đối với bảng người liên hệ.

Tạo vai trò web

Bạn có thể sử dụng một vai trò web hiện có trong trang web của mình hoặc tạo một vai trò web mới.

  1. Ở ngăn bên trái, hãy chọn Vai trò web .

  2. Chọn Mới.

  3. Trong hộp Tên , hãy nhập Người dùng API Web (hoặc bất kỳ tên nào phản ánh đúng nhất vai trò của người dùng truy cập chức năng này).

  4. Trong danh sách Trang web , hãy chọn bản ghi trang web của bạn.

    Thêm vai trò web của người dùng API web

  5. Chọn Lưu.

Thêm quyền đối với bảng liên quan

  1. Với vai trò web mới hoặc hiện có, hãy chọn Liên quan > Quyền bảng.

    Thêm quyền đối với bảng liên quan vào vai trò web.

  2. Chọn Thêm quyền bảng hiện có.

  3. Chọn Quyền bảng liên hệ, được tạo trước đó.

    Chọn quyền đối với bảng người liên hệ.

  4. Chọn Thêm.

  5. Chọn Lưu & Đóng.

    Xem quyền đối với bảng.

Thêm người liên hệ vào vai trò web

  1. Ở ngăn bên trái, hãy chọn Danh bạ.

  2. Chọn một địa chỉ liên hệ mà bạn muốn sử dụng trong ví dụ này cho API Web.

    Lưu ý

    Địa chỉ liên hệ này là tài khoản người dùng được sử dụng trong ví dụ này để kiểm tra API Web. Đảm bảo chọn đúng địa chỉ liên hệ trong cổng thông tin của bạn.

  3. Chọn **** > Vai trò web có liên quan.

    Chọn các vai trò web có liên quan.

  4. Chọn Thêm vai trò web hiện có.

  5. Chọn vai trò Người dùng API Web đã tạo trước đó.

  6. Chọn Thêm.

    Dạng xem liên kết vai trò web.

  7. Chọn Lưu & Đóng.

Bước 3. Tạo trang web

Bây giờ bạn đã bật API Web và định cấu hình quyền của người dùng, hãy tạo một trang web với mã mẫu để xem, chỉnh sửa, tạo và xóa bản ghi.

  1. Trên ngăn bên trái của ứng dụng Quản lý cổng thông tin , chọn Trang web.

  2. Chọn Mới.

  3. Trong hộp Tên, hãy nhập webapi.

  4. Trong danh sách Trang web, hãy chọn bản ghi trang web của bạn.

  5. Đối với Trang chính, chọn Trang chủ.

  6. Đối với URL một phần, hãy nhập webapi.

  7. Đối với Mẫu trang, chọn Trang chủ.

  8. Đối với Trạng thái phát hành, chọn Đã phát hành.

  9. Chọn Lưu.

    Trang Web.

  10. Chọn Có liên quan > Trang web.

    Trang web có liên quan

  11. Trong mục Dạng xem liên kết của trang web, hãy chọn webapi.

    Dạng xem Liên kết Trang Web.

  12. Cuộn xuống phần Nội dung, sau đó chuyển đến mục Sao chép (HTML) (Trình thiết kế HTML).

    Sao chép nội dung HTML

  13. Chọn tab HTML.

    Chọn tab HTML

  14. Sao chép và dán đoạn mã sau vào trình thiết kế 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>
    

    Dán mã.

  15. Chọn Lưu & Đóng.

Bước 4. Xóa bộ nhớ đệm cổng thông tin

Bạn đã tạo một trang mẫu webapi để kiểm tra chức năng API Web. Trước khi bạn bắt đầu, hãy đảm bảo rằng bộ nhớ đệm cổng thông tin Power Apps đã được xóa để các thay đổi từ ứng dụng Quản lý cổng thông tin được phản ánh trên cổng thông tin của bạn.

QUAN TRỌNG: Việc xóa bộ đệm ẩn phía máy chủ của cổng thông tin sẽ tạm thời làm hiệu suất cổng thông tin sụt giảm trong khi dữ liệu đang được tải lại từ Microsoft Dataverse.

Để xóa bộ đệm ẩn:

  1. Đăng nhập vào cổng thông tin với vai trò thành viên có vai trò web Quản trị viên.

  2. Thay đổi URL bằng cách nối thêm /_ services/about ở cuối. Ví dụ: nếu URL cổng thông tin là https://contoso.powerappsportals.com, hãy đổi nó thành https://contoso.powerappsportals.com/_services/about.

    Xóa bộ đệm ẩn.

    LƯU Ý: Bạn phải là thành viên của vai trò web Quản trị viên để xóa bộ đệm. Nếu bạn thấy một màn hình trống, hãy kiểm tra các lần gán vai trò web.

  3. Chọn Xóa bộ nhớ cache.

Thông tin thêm:  Xóa bộ nhớ đệm phía máy chủ cho một cổng thông tin

Bước 5. Sử dụng API web để ghi, xem, chỉnh sửa, tạo và xóa

Trang web mẫu có URL webapi được tạo trước đó giờ đã sẵn sàng để thử nghiệm.

Cách kiểm tra chức năng API Web:

  1. Đăng nhập vào cổng thông tin của bạn bằng tài khoản người dùng đã được chỉ định vai trò Người dùng API Web mà bạn đã tạo trước đó.

  2. Đi đến trang web webapi được tạo trước đó. Ví dụ, https://contoso.powerappsportals.com/webapi. WebAPI sẽ truy xuất các bản ghi từ Microsoft Dataverse.

    Trang web webapi mẫu.

  3. Chọn Thêm bản ghi mẫu để thêm bản ghi mẫu từ tập lệnh.

  4. Chọn một trường. Trong ví dụ này, chúng tôi đã chọn Email để thay đổi địa chỉ email của một liên hệ.

    Chỉnh sửa email

  5. Chọn nút Xóa để xóa bản ghi.

Bây giờ bạn đã tạo một trang web với một mẫu để ghi, chỉnh sửa, tạo và xóa bản ghi, bạn có thể tùy chỉnh các biểu mẫu và bố cục.

Bước tiếp theo

Soạn các yêu cầu HTTP và xử lý lỗi

Xem thêm

Tổng quan API web cổng thông tin
Thao tác ghi, cập nhật và xóa cổng thông tin bằng Web API
Các hoạt động đọc cổng sử dụng API Web
Đặt cấu hình các quyền đối với cột

Lưu ý

Bạn có thể cho chúng tôi biết bạn thích dùng ngôn ngữ nào cho tài liệu không? Làm một cuộc khảo sát ngắn. (xin lưu ý, khảo sát này bằng tiếng Anh)

Cuộc khảo sát sẽ mất khoảng bảy phút. Không có dữ liệu cá nhân nào được thu thập (điều khoản về quyền riêng tư).