65.9K
CodeProject 正在变化。 阅读更多。
Home

酒店应用融合开发(第二部分):启用客户入住

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2022 年 3 月 21 日

CPOL

6分钟阅读

viewsIcon

3864

如何创建在 Azure 中对 Dataverse 中的数据更改做出响应的无服务器应用。

本系列三篇文章的第一篇演示了公民开发者如何使用低代码解决方案(如 Microsoft Power Apps)来创建自给自足的应用。该应用可管理住客入住登记,收集有关住客所需服务的其他信息。

本系列的第二篇文章将探讨专业开发者如何创建无服务器应用(在 Azure 中),该应用能够响应 Dataverse 中数据的更改。此应用可帮助公民开发者修改其应用,而不会影响后端中存储的实际数据。虽然本教程以 Python 代码为例,但其他支持的语言也同样适用。

目标

上一篇教程在 Dataverse 中设置了“Reservations”表,并创建了一个 Power App 来办理住客入住。到目前为止,该应用只能与 Dataverse 表配合使用。酒店员工可以使用它来确定是否有住客通过应用办理入住。然而,连锁酒店的中央企业数据库对此活动一无所知。

作为专业开发者,我们可能还负责维护企业后端,现在我们可以构建一个连接器,将 Dataverse 中的数据与后端系统连接起来。订阅 Azure 事件中心(Event Hub)事件,可以在不修改 UI 应用的情况下响应其更改。

该方法如下所示:

  1. 在 Microsoft 系统中创建映射,以发送自定义事件消息。
  2. 员工为住客办理入住。
  3. 该操作会在 Dataverse 中触发更新事件。
  4. 通过映射,Power Platform 将事件发送到事件中心。
  5. 函数应用(Function app)会接收事件,进行处理,并通知后端。

这些步骤无需修改 Power App 即可完成,将 UI 与后端功能隔离开来。

此过程包含四个步骤:

  1. 在 Azure 中创建事件中心。
  2. 在 Dataverse 中注册事件中心以进行更新操作。
  3. 验证事件是否已发送。
  4. 创建函数应用以响应事件中心事件。

创建事件中心

首先,在Azure 门户中搜索“事件中心”以创建事件中心命名空间。完成后,转到该资源。

接下来,转到“共享策略”,创建一个具有侦听和发送权限的策略。复制连接字符串并保存以备后续步骤使用。

然后,单击“创建事件”以创建一个供函数应用监视的事件。

注册服务终结点

为了让事件中心能够监视 Dataverse 中的更改,需要注册连接。请参阅Microsoft 文档,了解下载插件注册工具(Plugin Registration Tool)的说明。

首先,打开“插件注册工具”,然后使用 Office 365 选项登录到组织。登录完成后,该工具将显示现有注册列表。单击“注册 > 注册新服务终结点”。

使用事件中心的连接字符串,选择“EventHub”作为“目标类型”,选择“JSON”作为“消息格式”,以便函数应用可以接收 JSON 格式的数据而不是 XML。服务终结点应类似于此截图。

现在,通过注册一个监视 Dataverse 中更改的新步骤,告知 Microsoft 服务终结点将执行的操作。当终结点检测到“Reservation”表中的更新时,事件中心将触发一个事件。

消息”是事件中心应监视的操作类型。在这种情况下,选择“更新”以监视“Reservation”表中的更新更改。

主实体”是要监视的实体。在此情况下,监视“Reservation”表中的更改。

注册工具通过名称调用实体。上一篇教程创建 Dataverse 表时,创建了一个显示名称为“Reservation”的表,但 Power Platform 也创建了一个内部表名。在“主实体”中使用 Power Platform 的名称。

选择已注册的服务终结点作为事件处理程序。

验证服务终结点注册

现在一切都已准备就绪,当预订表中的记录发生更改时,事件中心就会触发。现在,我们需要验证事件注册是否成功。

使用 Power App 测试,方法是编辑住客的预订。

然后,为确认事件已触发,转到Power Apps 制作门户。单击“设置”齿轮图标,然后选择“高级设置”以进入 Dynamics 365 设置页面。

从下拉列表中选择“系统 > 系统作业”。

如果更改成功,“为住客办理入住”应出现在日志中与特定预订代码(主键)相邻的位置。

这就完成了我们将公民开发者所做的工作并将其处理到酒店后端所需的所有步骤。请注意,这不需要编写一行代码!

消费事件

开发者可以创建一个函数应用来响应事件中心触发器以消费事件。我们可以使用 Visual Studio (VS) Code 中的 Azure Functions 工具扩展来创建函数应用并将其部署到 Azure。

此操作会在侧边栏创建一个 Azure 图标。然后,我们可以通过面板上的按钮直接创建项目和函数。

本教程将创建一个 Python 应用作为示例,但任何支持的语言都可以。这里重要的设置是使用事件中心触发器。

首先,按照提示使用“事件中心触发器”创建一个 Python 应用,指向之前的事件中心命名空间。此操作会创建一个包含默认属性的 JSON 文件。

然后,更新到事件中心命名空间的连接字符串。连接字符串来自命名空间创建的“共享访问策略”选项卡。

最后,更新代码以处理事件。在此示例中,它会将数据发布到一个临时 Webhook。

部署前,请确保 `requirements.txt` 包含此项目所需的库:`azure-functions` 和 `requests`。VS Code 创建项目时会包含 `azure-functions`。`requests` 库将向模拟端点发送 `POST` 请求。

azure-functions
requests

此代码示例将更改的字段传递给模拟端点。

from typing import List
import logging
import azure.functions as func
import json
import requests

def main(events: List[func.EventHubEvent]):
    logging.info('Started Function app')
    for event in events:
        body=event.get_body()
        # Convert the raw data into a dict struct by parsing JSON
        jsonContent = body.decode('utf-8')
        jsn = json.loads(jsonContent)

        # Take the input parameters from the incoming message
        inputParams = jsn['InputParameters'][0]['value']['Attributes']
        # Take the identifiers that identifies the reservation in the SQL database
        identifiers = jsn['PostEntityImages'][0]['value']['Attributes']

        # Create a payload that includes both the changed values and identifiers
        payload = {}
        payload['values'] = inputParams
        payload['ids'] = identifiers
 
        r = requests.post('https://webhook.site/4d2e2587-8d82-4605-ad06-47ad29827184', \
                           data=json.dumps(payload))

        message = body['MessageName']
        logging.info('Python EventHub trigger processed message: \
                      %s with input parameters %s', message, inputParams)

反序列化 `event.get_body()` 有助于分析整个事件消息。然后,代码从 `InputParameters` 属性值中的第一个元素中提取 Dataverse `Update` 事件的已更改属性。

接下来,部署函数应用。然后,通过使用 UI 应用再次办理住客入住来对其进行测试。模拟端点将出现一个 POST 请求。

此处显示的示例 JSON 表明它在 `InputParameters` 属性中包含所有必需的信息。

{
    "values":[
        {
            "key":"cr7ec_checkintime",
            "value":"/Date(1631599320000)/"
        },
        {
            "key":"cr7ec_reservationid",
            "value":"1e7ac787-c077-ec11-8942-000d3a0c84c3"
        },
        {
            "key":"timezoneruleversionnumber",
            "value":0
        },
        {
            "key":"modifiedon",
            "value":"/Date(1643556032000)/"
        },
        ...
    ],
    "ids":[
        {
            "key":"cr7ec_reservationcode",
            "value":"CRX58345"
        },
        {
            "key":"cr7ec_reservationid",
            "value":"1e7ac787-c077-ec11-8942-000d3a0c84c3"
        }
    ]
}

端点可以使用标识符(通过预订代码)指向预订,并包含修改的字段,然后更新公司 SQL 数据库中的预订状态。

已部署的 `Function` 应用会响应预订表条目更改。

后续步骤

我们已成功创建了一个 `Function` 应用来响应 UI 应用中的更改,而无需更改 UI 应用的任何内容。因此,公民开发者可以继续在 Power Apps 平台中修改 UI 应用,而无需专业开发者的参与。

这种方法是一个很大的优势,因为公民开发者可以在不具备编码技能或不接触后端系统的情况下调整应用以满足快速变化的业务需求。

继续阅读最后一篇文章,了解如何将数据添加到系统中。本教程将探讨将数据插入 Reservation Dataverse 表,然后扩展 UI 应用以包含住客过往入住信息。

要了解如何加速基础应用程序开发,请参阅低代码应用开发人员的 7 步指南

© . All rights reserved.