DreamFacotry 第6章 将业务逻辑集成到DreamFactory API中

DreamFactory在为各种数据源(包括Microsoft SQL Server,MySQL,SFTP,AWS S3等)生成API方面做得非常出色。自然地,生成的API端点涵盖了客户端与数据源进行交互时预期需要的大多数功能。但是,由于很少有两家公司或项目是相同的,因此很少能以切块刀的方式创建软件。因此,DreamFactory为开发人员提供了通过集成自定义业务逻辑来扩展API的能力。

脚本界面

可通过ScriptsDreamFactory管理控制台顶部的选项卡访问脚本界面。输入后,将为您提供DreamFactory实例中托管的API列表。输入其中一个API,您将看到与该API关联的端点“存储桶”的顶级摘要。例如,如果您输入数据库支持的API,您将看到存储桶,例如_func(存储功能),_proc(存储过程),_schema(表结构)和_table(表)。例如,此屏幕快照显示了Microsoft SQL Server API的顶级接口:

您可以将脚本逻辑应用于整个存储桶,这意味着它将与匹配该名称空间的任何API端点一起执行,或者可以将逻辑应用于非常特定的端点。此外,您可以选择将逻辑选择性地应用于API工作流的请求或响应端,可以将逻辑排队以便在工作流之外执行,还可以指定逻辑与特定的HTTP动词(GET,POST等)一起执行)。我们将在本章后面详细讨论这些关键功能。

如果继续向下钻取到特定的端点,最终将到达脚本编辑界面。例如,在以下屏幕截图中,我们已导航到SQL Server API的customer表终结点。具体来说,此脚本仅在GET对此端点发出请求时才执行,并从数据源返回数据后将触发。

DreamFactory显示API端点的完整列表的能力取决于相应的OpenAPI文档的可用性。该文档是为本机连接器自动生成的,但是对于诸如远程HTTP和脚本化的连接器,您需要提供文档,以便通过脚本界面仔细阅读端点。

尽管基本脚本编辑器适用于简单脚本,但您可能仍希望使用版本控制来管理更复杂的脚本。配置版本控制(均支持GitHub,BitBucket和GitLab)或基于文件系统的API后,您可以通过Link to a service位于界面左下方的选择框选择所需的API来链接到脚本在上面的屏幕截图中显示。

支持的脚本引擎

DreamFactory当前支持四个脚本引擎,包括:

  • PHP:PHP是世界上最流行的服务器端Web开发语言。
  • Python:Python是一种流行的多面语言,具有许多不同的应用程序,包括人工智能,后端Web开发和数据分析。
  • Node.js:Node.js是在Chrome的V8 JavaScript引擎之上构建的JavaScript运行时。
  • JavaScript:PHP的扩展为Google的V8 JavaScript引擎提供了其他JavaScript支持。

请记住,这些不是脚本引擎的原始版本或不完整的版本。DreamFactory与服务器上安装的实际语言解释器一起使用,并允许您将第三方库和程序包导入脚本环境。

例子 转换响应

{"resource": [{"Id": 1,"FirstName": "Bob","LastName": "Anders","City": "Berlin","Country": "Germany","Phone": "030-0074321","messages": []},{"Id": 2,"FirstName": "Ana","LastName": "Trujillo","City": "México D.F.","Country": "Mexico","Phone": "(5) 555-4729","messages": []},...]
}$responseBody = $event['response']['content'];foreach ($responseBody['resource'] as $n => $record) {$record["Name”]["FirstName"] = $record["FirstName"];$record["Name”]["LastName"] = $record["LastName"];unset($record["FirstName"]);unset($record["LastName"]);$responseBody['resource'][$n] = $record;
}$event['response']['content'] = $responseBody;

使用第三方库

如本章前面所述,DreamFactory会将脚本传递给服务器上安装的设计脚本语言。这意味着您不仅可以访问所有脚本语言的语法(而不是某些笨拙的版本),还可以访问语言社区的第三方软件包和库!

添加Composer软件包

DreamFactory基于PHP语言构建,并使用Composer安装和管理在整个平台上使用的许多内部构建的和第三方的软件包。如果您想在脚本中利用Composer软件包,请使用global修饰符在全局范围内安装它。例如,假设您想从脚本发送Tweet。您可以使用twitteroauth软件包来这样做:

$ composer global require abraham/twitteroauth

安装后,您可以在DreamFactory脚本中通过其名称空间使用该软件包,如以下示例所示:

$consumerKey    = env('TWITTER_CONSUMER_KEY');
$consumerSecret = env('TWITTER_CONSUMER_SECRET');
$oauthToken     = env('TWITTER_OAUTH_TOKEN');
$oauthSecret    = env('TWITTER_OAUTH_SECRET');$connection = new \Abraham\TwitterOAuth\TwitterOAuth($consumerKey, $consumerSecret, $oauthToken, $oauthSecret
);if ($event['request']['method'] == "POST") {$message = $event['request']['payload']['resource'][0]['message'];$response = $connection->post("statuses/update", ["status" => $message]);}return json_encode(["response" => $response]);

您将要全局安装软件包,因为唯一的替代方法是通过DreamFactory的Composer文件在本地安装软件包。这些软件包的行为与全局安装的软件包相同,但是最终您将需要升级DreamFactory的Composer文件。

添加一个PHP类库

如果您想在脚本中重用自定义代码,并且不想在Composer软件包中管理代码,则可以使用set_include_path()函数将类添加到PHP的include路径。一旦包含,就可以使用require_once语句导入该类。以下示例脚本中演示了此方法:

set_include_path("/home/wjgilmore/libraries");require_once('Filter.php');$filter = new \WJGilmore\Validate\Validate();try {$filter->username("dreamfactory");} catch (\Exception $e) {$event['response'] = ['status_code' => 400, 'content' => ['success' => false,'message' => $e->getMessage()]];}

所引用的Filter类在名为的文件中找到,Filter.php如下所示:

<?phpnamespace WJGilmore\Validate;use Exception;class Validate {public function username($username) {if (preg_match("/^[a-zA-Z0-9\s]*$/", $username) != 1) {throw new Exception("Username must be alphanumeric.");}return true;}}

如果您想将特定目录永久添加到PHP的include路径,请修改include_path配置指令。

更多信息

我们仍在将脚本文档迁移到本指南中,因此暂时请查阅我们的Wiki以获取有关脚本的更多信息:

  • https://wiki.dreamfactory.com/DreamFactory/Features/Scripting
  • https://wiki.dreamfactory.com/DreamFactory/Tutorials/Server_Side_Scripting

计划任务

DreamFactory本身不支持计划的任务,但是您可以为此设置CRON作业。让我们创建一个示例,该示例在一天中的每分钟调用一次。

创建脚本

首先,我们将创建脚本来调用API。一种简单的方法是导航至API Docs选项卡,然后将cURL命令复制为我们要进行的适当调用。在这种情况下,我们附加了GET在两个数据库_table/employees之间同步数据的业务逻辑。

一旦有了cURL命令,就可以使用此有用的工具将其转换为PHP 。之后,我们将cron.phppublic包含生成的PHP代码的文件夹中创建一个名为的文件。

运行CRON作业

首先,让我们定义CRON作业参数:

* * * * * /usr/bin/php /opt/dreamfactory/public/cron.php >/dev/null 2>&1

这可以分为4个部分:计时,执行PHP,脚本路径和输出。在此示例中,该* * * * *方法将每分钟运行一次。第二部分是允许执行PHP的PHP路径。现在,重要的部分是提供您要运行的文件的完整路径。最后,您可以将输出写入文件或丢弃它,在这种情况下,我将其设置为丢弃。如果您想了解更多有关该结构的信息,请查看本文。

接下来,您将crontab通过运行以下命令进行编辑:

crontab -e

您将被置于文本编辑器中,您可以在其中简单地粘贴CRON作业并保存它。现在,您有每分钟运行的计划任务来调用您的API!

配置Python 3

由于2020年1月1日正式退出Python 2.X,DreamFactory 3.0添加了对Python 3的支持。请记住,DreamFactory的Python 2集成还没有消失!我们只是想为用户提供足够的时间来开始升级他们的脚本以使用Python 3。

Python 3脚本支持将自动在所有DreamFactory 3实例中提供。但是,为了使Python 3脚本正常运行,新用户和升级用户必须考虑一个重要的配置更改。DreamFactory的Python 2支持取决于Bunch,而Bunch不支持Python 3,因此必须使用Bunch包的一个分支Munch代替。

您将通过Python的pip包管理器安装Munch 。安装时应使用Python 3特定版本的pip,称为pip3。如果您的服务器尚未包含pip3(通过执行查找which pip3),则可以使用服务器操作系统的程序包管理器进行安装。例如,在Ubuntu上,您可以这样安装它:

$ apt-get install -y --allow-unauthenticated python3-pip

安装pip3后,您可以安装munch:

$ pip3 install munch

安装后,您需要更新.env文件(或服务器环境变量)以指向Python 3解释器:

DF_PYTHON3_PATH=/usr/local/bin/python3

您可以通过执行以下命令找到Python 3解释器路径:

$ which python3

保存这些更改后,重新启动PHP-FPM和Apache / Nginx服务。

DreamFacotry 第6章 将业务逻辑集成到DreamFactory API中相关推荐

  1. petshop详解之五:PetShop之业务逻辑层设计

    五 PetShop之业务逻辑层设计业务逻辑层(Business Logic Layer)无疑是系统架构中体现核心价值的部分.它的关注点主要集中在业务规则的制定.业务流程的实现等与业务需求有关的系统设计 ...

  2. ASP.NET2.0数据操作之创建业务逻辑层

    导言 本教程的第一节所描述的数据访问层(Data Access Layer,以下简称为DAL)已经清晰地将表示逻辑与数据访问逻辑区分开了.不过,即使DAL将数据访问的细节从表示层中分离出来了,可它却不 ...

  3. petshop4.0 详解之五(PetShop之业务逻辑层设计)[转]

    业务逻辑层(Business Logic Layer)无疑是系统架构中体现核心价值的部分.它的关注点主要集中在业务规则的制定.业务流程的实现等与业务需求有关的系统设计,也即是说它是与系统所应对的领域( ...

  4. petshop4.0 详解之五(PetShop之业务逻辑层设计)

    五 PetShop之业务逻辑层设计 业务逻辑层(Business Logic Layer)无疑是系统架构中体现核心价值的部分.它的关注点主要集中在业务规则的制定.业务流程的实现等与业务需求有关的系统设 ...

  5. PetShop之业务逻辑层设计

    <解剖PetShop>系列之五 五 PetShop之业务逻辑层设计 业务逻辑层(Business Logic Layer)无疑是系统架构中体现核心价值的部分.它的关注点主要集中在业务规则的 ...

  6. 系统架构师-基础到企业应用架构-业务逻辑层

    一.上章回顾 上章我们主要讲述了系统设计规范与原则中的具体原则与规范及如何实现满足规范的设计,我们也讲述了通过分离功能点的方式来实现,而在软件开发过程中的具 体实现方式简单的分为面向过程与面向对象的开 ...

  7. [wayfarer]PetShop之业务逻辑层设计

    原文地址: http://www.cnblogs.com/wayfarer/archive/2006/11/05/550723.html <解剖PetShop>系列之五 五 PetShop ...

  8. 系统架构之业务逻辑层

    一.上章回顾 上章我们主要讲述了系统设计规范与原则中的具体原则与规范及如何实现满足规范的设计,我们也讲述了通过分离功能点的方式来实现,而在软件开发过程中的具 体实现方式简单的分为面向过程与面向对象的开 ...

  9. 系统架构师谈企业应用架构之业务逻辑层

    一.上章回顾 上章我们主要讲述了系统设计规范与原则中的具体原则与规范及如何实现满足规范的设计,我们也讲述了通过分离功能点的方式来实现,而在软件开发过程中的具体实现方式简单的分为面向过程与面向对象的开发 ...

最新文章

  1. 局域网流量控制_羡慕多屏协同?这3款 App 让你的电脑也能轻松控制 Android 手机...
  2. Xilinx DMA kernel 驱动详解 (一)
  3. matlab simulink_MATLAB之Simulink(二)利用switch模块将正弦信号变为方波信号
  4. 容器宿主机数据库_解决Docker容器内访问宿主机MySQL数据库服务器的问题
  5. IIS设置的解决方案
  6. html旅途模版,HTML黄色欧美形式探险旅途指南网页模板代码
  7. dll修改和EXCOPE
  8. 区块链中的密码学(五)-零知识证明简述
  9. 【序列化与反序列化流】
  10. 【企业】走近华为,微观世界
  11. 第九届大唐杯省赛知识梳理-5G协议与信令(20%)
  12. android 安装包反编译,Android逆向之反编译APK和安装包漏洞解析
  13. unity3d 游戏模型中世纪场景素材
  14. Windows命令:tracert
  15. 软件测试面试的自我介绍
  16. 中国有互联网根服务器吗?
  17. Fuchsia编译与真机安装
  18. [BZOJ3698]XWW的难题(有源汇有上下界的最大流)
  19. oracle 内存错误的是什么意思,java - 是什么导致此JMS错误连接到OracleAQ? - 堆栈内存溢出...
  20. 车辆运动控制(4)考虑道路曲率和轮胎滑移

热门文章

  1. ActivePython 百科指南
  2. Microsoft Enterprise Library 5.0 系列(五) Data Access Application Block
  3. SEO之Google--PageRank优化剖析(三)
  4. Intro.js轻松搞定页面引导流程
  5. 20 Excellent AJAX Effects You Should Know
  6. Python_操作txt、xls、csv、PDF
  7. 斗地主AI算法——第十四章の主动出牌(3)
  8. Leetcode算法题(C语言)14--颠倒整数
  9. Linux——VIM多选缩进及高级命令
  10. winform窗体数据的添加 1217