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

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 người 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 trang web

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. Khởi động ứng dụng Quản lý cổng thông tin.

  2. Trên ngăn bên trái của ứng dụng Quản lý cổng thông tin, chọn Thiết đặt trang web.

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

  3. Chọn Mới.

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

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

  6. Trong hộp Giá trị, hãy nhập true.

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

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

  8. Chọn Tạo mới.

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

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

  11. Trong hộp Giá trị, hãy nhập
    tên, họ, tên đầy đủ, địa chỉ email1, điện thoại1

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

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

  13. Chọn Tạo mới.

  14. 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.

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

  16. Trong hộp Giá trị, hãy nhập true.

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

  18. Xác minh thiết đặ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ẽ cần thiết lập hoặc tạo vai trò web mới sử dụng API web, sau đó thêm quyền của bảng cho bảng Người liên hệ và liên kết quyền của bảng đó với vai trò web, rồi cuối cùng gán vai trò web cho người dùng để cho phép họ sử dụng API web.

Lưu ý

API web tuân theo các quyền của bảng đến từ ngữ cảnh vai trò web của người dùng đã xác thực hoặc vai trò web ẩn danh. Hãy cân nhắc xem liệu người dùng của bạn đã có vai trò web có quyền truy cập vào các bảng cụ thể trong trang web mà API web cần hay chưa. Bạn không cần tạo thêm vai trò web chỉ để sử dụng API web.

Tạo vai trò web

Nếu hiện tại không có vai trò web có quyền đối với bảng mà bạn đang truy cập thông qua API web hoặc yêu cầu ngữ cảnh truy cập dữ liệu khác, hãy làm theo các bước sau đây để biết cách tạo vai trò web mới và gán quyền của bảng.

  1. Khởi động ứng dụng Quản lý cổng thông tin.

  2. Trên ngăn bên trái, trong phần Bảo mật, hãy chọn Vai trò web .

  3. Chọn Mới.

  4. Trong ô Tên, nhập Người dùng API web (hoặc bất kỳ tên nào phản ánh rõ nhất vai trò của người dùng khi truy cập chức năng này).

  5. 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

  6. Chọn Lưu.

Tạo các quyền của bảng

  1. Khởi chạy studio thiết kế Power Pages.

  2. Chọn không gian làm việc Bảo mật .

  3. Trong phần bảo vệ , chọn Quyền bảng.

  4. Chọn Quyền mới.

  5. Trong hộp Tên, hãy nhập Quyền đối với bảng người liên hệ.

  6. Trong danh sách Tên bảng, hãy chọn Người liên hệ (liên hệ).

  7. Trong danh sách Loại quyền truy nhập, hãy chọn Toàn cầu.

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

  9. Chọn + Thêm vai trò và chọn vai trò web bạn đã chọn hoặc đã tạo trước đó.

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

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

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

  1. Khởi động ứng dụng Quản lý cổng thông tin.

  2. Trên ngăn bên trái, trong phần Bảo mật, hãy chọn Người liên hệ.

  3. 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.

  4. Chọn Có liên quan>Vai trò web.

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

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

  6. Chọn vai trò Người dùng API web được tạo trước đó.

  7. Chọn Thêm.

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

  8. 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. Khởi chạy studio thiết kế Power Pages.

  2. Trong không gian làm việc Trang, hãy chọn + Trang.

  3. Trong hộp thoại Thêm trang,

  4. Trong hộp Tên, hãy nhập WebAPI và chọn Bắt đầu từ bố cục trống.

  5. Chọn Thêm.

  6. Chọn tùy chọn Chỉnh sửa mã ở góc trên bên phải.

  7. Chọn Mở Visual Studio Code.

  8. Sao chép đoạn mã mẫu sau và dán vào giữa các thẻ <div></div> của phần trang.

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

  9. Chọn CTRL-S để lưu mã.

  10. Trong studio thiết kế, hãy chọn Đồng bộ hóa để cập nhật trang web bằng các chỉnh sửa code.

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

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

  1. Chọn Bản xem trước rồi chọn Máy tính để bàn.

  2. Đăng nhập vào trang web của bạn bằng tài khoản người dùng đã được gán vai trò Người dùng API web đã tạo trước đó.

  3. Truy cập trang web WebApi đã tạo trước đó.

    Trang web webapi mẫu.

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

  5. 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

  6. Chọn biểu tượng 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 yêu cầu HTTP và xử lý lỗi

Xem thêm