DreamFacotry 第6章 将业务逻辑集成到DreamFactory API中
DreamFacotry 第6章 将业务逻辑集成到DreamFactory API中
DreamFactory在为各种数据源(包括Microsoft SQL Server,MySQL,SFTP,AWS S3等)生成API方面做得非常出色。自然地,生成的API端点涵盖了客户端与数据源进行交互时预期需要的大多数功能。但是,由于很少有两家公司或项目是相同的,因此很少能以切块刀的方式创建软件。因此,DreamFactory为开发人员提供了通过集成自定义业务逻辑来扩展API的能力。
脚本界面
可通过Scripts
DreamFactory管理控制台顶部的选项卡访问脚本界面。输入后,将为您提供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
如下所示:
<?php
namespace 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.php
在public
包含生成的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服务。