生成一个数据库支持的API

DreamFactory的功能非常强大,但是最受欢迎的功能莫过于它能够生成一个数据库支持的REST API。通过采用这种自动化的方法,开发团队可以将开发周期缩短几周(如果不是几个月的话),并且这样做可以极大地降低由于SQL注入等错误而导致的错误或安全问题的可能性。这种方法也不需要付出代价,因为DreamFactory的数据库支持的api是全功能的REST接口,提供了全面的CRUD(创建、检索、更新、删除)功能、用于执行存储过程的端点,甚至还有用于管理模式的端点。

在本章中,您将了解DreamFactory在几分钟内生成、保护和部署数据库支持API的能力。你将从实践中学习,跟随我们:

  • 生成一个新的数据库支持的REST API
  • 使用API密钥和角色保护API对API的访问
  • 与自动生成的Swagger文档交互
  • 通过第三方HTTP客户端查询API
  • 同步两个数据库之间的记录

我们选择MySQL作为整个章节示例的基础,因为它是免费的,在主机提供商和云环境中无处不在,并且可以很容易地安装在所有操作系统上。因此,要跟随本章,你需要:

  • 访问DreamFactory实例和MySQL数据库。
  • 如果你的MySQL数据库不是在你的笔记本电脑上运行,你需要确保你的防火墙配置为允许端口3306和你的DreamFactory实例正在运行的位置之间的流量。
  • 一个MySQL用户帐户,配置成它可以从DreamFactory实例的IP地址连接到你的MySQL服务器。

在我们开始之前,请记住MySQL只是DreamFactory支持的18个数据库之一。下表给出了支持的完整列表:

数据库 SQL和非SQL
AWS DynamoDB IBM Informix
AWS红移 MongoDB
Azure DocumentDB MySQL
Azure表存储 甲骨文
卡珊德拉 PostgreSQL
Salesforce
CouchDB SAP SQL Anywhere
火鸟 SQLite
IBM Db2 SQL Server

最重要的是,多亏了DreamFactory的统一接口和API生成解决方案,你在本章学到的一切都适用于你所选择的数据库!因此,如果您已经计划使用另一个数据库,那么无论如何都可以使用它来代替!

生成一个mysql支持的API

要生成mysql支持的API,请使用管理员帐户登录到您的DreamFactory实例,并单击Services选项卡:

在界面的左侧,您将看到创建按钮。单击此按钮开始生成API。您将看到一个单下拉表单控件选择服务类型。您将使用这个下拉菜单生成新的api并配置额外的身份验证选项。这个菜单中有很多要回顾的内容,但现在让我们停留在轨道上,只是导航到数据库然后MySQL

选择MySQL后,你会看到下面的表单:

让我们回顾一下这些字段:

  • 名字:该名称将构成API URL的一部分,因此您需要使用不带空格或特殊字符的小写字符串。此外,您通常会希望选择一些允许您轻松识别API用途的东西。例如,对于您的mysql支持的API,您可以选择一个名称,例如mysql企业,或商店记住,把名字小写是必须的。
  • 标签:在管理接口和与系统相关的API响应中,标签用于引用目的。你可以在这里使用一些不那么简洁的东西,比如“mysql支持的企业数据库API”。
  • 描述:与标签一样,描述在管理接口和与系统相关的API响应中用于引用目的。
  • 活跃的:这决定API是否处于活动状态。默认情况下,它被设置为活动的,但是如果你还没有准备好开始使用API,或者想稍后暂时禁用它,只需返回此屏幕并切换复选框。

完成这些字段后,单击配置位于界面顶部的选项卡。你会看到下面的表单(我只展示表单的顶部,因为这个表单相当长):

这个表格一开始可能看起来有点吓人,但在大多数情况下,你只需要填写几个字段。让我们首先讨论这些,然后概述可选字段。

必填配置字段

为了生成一个数据库支持的API,只需要完成5个(有时是6个)字段。这些包括:

  • 宿主数据库服务器的主机地址。这可能是IP地址或域名。
  • 端口号:数据库服务器端口号。例如,在MySQL中,这是3306。
  • 数据库:您想通过API公开的数据库的名称。
  • 用户名:与数据库用户帐号关联的用户名,用于连接数据库。
  • 密码:连接数据库的数据库用户帐号对应的密码。
  • 模式:如果你的数据库支持模式的概念,你可以在这里指定它。MySQL不支持模式的概念,但许多其他数据库支持。

可选配置字段

在必选字段之后,您将发现许多可选参数。根据您所选择的数据库类型的不同,这些可能会略有不同,所以如果您在下面看到一些变化,请不要感到惊讶。目前不要太担心这个问题,因为此时您可能不需要修改任何可选配置字段。然而,我们想要确定一些比其他字段更常用的字段:

  • 最高记录:可以使用该字段设置返回记录数量的上限。
  • 启用数据检索缓存:启用缓存将极大地提高性能。此字段与缓存存活时间,接下来介绍。
  • 缓存生存时间(分钟):开启数据缓存后,可以通过该字段指定缓存的生存时间,单位为分钟。

在完成必要的字段和任何所需的可选字段后,按保存按钮来生成API。过了一会儿,您将看到一个弹出消息,指示服务保存成功。祝贺您,您已经生成了第一个数据库支持的API!那么你能用这个酷炫的新玩具做什么呢?继续往下读,了解更多。

关于API功能的说明

大多数数据库采用用户授权系统,使管理员能够确定用户成功建立连接后可以做什么。以MySQL为例,特权都用于此目的。管理员可以授予和撤销用户特权,并以此确定用户可以连接到哪些数据库,用户是否可以创建、检索、更新和删除记录,以及用户是否具有管理模式的能力。

因为DreamFactory代表该用户连接到数据库,因此生成的API在逻辑上受到该用户授权功能的限制。DreamFactory将显示一套完整的Swagger文档,所以如果你试图通过Swagger文档或任何其他客户端与API交互,并且没有获得预期的结果,一定要检查你的数据库用户权限,以确认用户确实可以执行预期的任务。

此外,请记住,这可以作为进一步锁定API的极好方法。尽管稍后您将了解到DreamFactory为限制API访问提供了一些优秀的与安全相关的特性,但是额外配置连接数据库用户的特权以反映所需的API功能肯定不会有什么坏处。例如,如果您希望API是只读的,那么就创建一个具有只读授权的数据库用户。如果需要API读取和创建功能,则相应地配置用户。

如何通过SSH隧道设置MySQL API

如果您希望DreamFactory通过SSH隧道连接到MySQL数据库,那么这是一个相对简单的过程,可以通过在DreamFactory服务器中启动SSH隧道来完成。首先,您需要将数据库服务器的密钥添加到DreamFactory实例所在的位置。然后打开一个终端窗口,输入以下命令,在必要的地方替换:

ssh -N -L :127.0.0.1: computerUser@ -i  . sh

例如,如果我想使用DreamFactory服务器的3307端口连接到MySQL服务器的默认数据库端口(3306),并且“admin”是远程SSH用户,具有必要的权限,命令可能如下所示:

ssh -N -L 3307:127.0.0.1:3306 admin@10.0.0.10 -i ./server_key . ssh

现在,一旦建立了连接,在DreamFactory界面中,我们就可以以与上面描述的相同的方式创建我们的服务,但是我们将它指向SSH隧道(localhost),而不是指向MySQL服务器。

就是这样!您现在拥有与使用标准mysql支持的API相同的功能,只是通过SSH连接而已。

使用邮差互动

安装

Postman是一个实用工具,它允许您快速测试和使用REST api。要使用最新发布的版本,请单击以下按钮将DreamFactory MYSQL API作为一个集合导入:

跑进邮差

您也可以从这种回购,然后直接导入到Postman中。

通过API文档标签与API交互

服务保存成功在成功生成一个新的REST API之后出现的消息是相当虎头虎尾的,因为这个简单的消息实际上并没有确切地传达DreamFactory为您和您的团队节省了多少乏味的工作。它不仅生成了一个功能齐全的REST API,而且还防止了未经授权的访问和额外生成的交互OpenAPI文档对于所有的端点!如果您以前没有使用过Swagger,那么您将会得到很大的好处,因为它是一个非常棒的工具,允许开发人员在不需要编写任何代码的情况下熟悉API。此外,每个端点都记录了关于输入参数和响应的详细信息。

要访问新API的文档,请单击API文档位于屏幕顶部的标签:

你会看到一个与你的DreamFactory实例相关的所有文档的列表。的db电子邮件文件日志系统,用户文档会自动包含在所有的DreamFactory实例中,如果你最终想以编程的方式管理你的实例,它会非常有用。让我们暂时忽略这些内容,专注于新生成的数据库文档。单击与此服务关联的表行以访问文档。你会看到一个像这样的屏幕:

浏览这个列表,您可以看到生成了相当多的API端点!如果您为支持存储过程的数据库生成API,则在顶部可以找到命名为获得/ _proc / {procedure_name}而且POST / _proc / {procedure_name}。向下滚动,您将遇到许多用于管理模式的端点,然后是一组CRUD(创建、检索、更新、删除)端点,这些端点无疑是最常用的端点。

查询表记录

让我们通过检索一组表记录来测试API。选择GET /_table/{table_name}获取一条或多条记录条目:

将打开一个包含两个部分的滑出窗口。第一,参数,表示支持的请求参数。第二个,反应,表示您期望通过响应接收到的内容,包括状态代码和JSON响应模板。在的情况下得到_ /表/ {table_name}端点,您可以使用相当多的参数,因为这个端点表示查询表数据的主要方式。通过操作这些参数,您将能够查询所有记录,或根据主键查询特定记录,或根据特定条件查询记录的子集。此外,还可以使用这些参数执行其他常见任务,如分组和计数记录,以及连接表。

要测试端点,请单击试试吧按钮,位于右侧。当您这样做时,输入参数字段将被启用,允许您输入值来修改默认查询的行为。现在我们只修改一个参数:table_name。它位于参数列表的最底部。输入您知道数据库中存在的表的名称,然后按下蓝色键执行按钮。在按钮下方,您将看到一个“Loading”图标,不久之后,在指定表中找到的记录列表将以JSON格式显示。下面是我在测试MySQL数据库上运行这个端点时看到的一个例子:

恭喜你!您已经通过Swagger文档成功地与数据库API进行了交互。如果您没有看到记录列表,请确认以下内容:

  • 指定的表是否存在?
  • 如果你收到500状态码,检查服务配置凭证。的500代码几乎肯定意味着DreamFactory无法连接到数据库。如果一切正常,请确保您可以通过数据库端口从DreamFactory实例的IP地址连接到数据库。如果不能,那么可能是防火墙的问题。

API Docs接口对于熟悉API非常有用,我们鼓励您继续尝试不同的端点,以了解更多关于它是如何工作的。然而,你最终会想要从通过API Docs接口与你的API交互过渡到使用第三方客户端,最终通过你自己的自定义应用程序。现在让我们进行下一步,使用HTTP客户机与新API交互。在上一章中,我们向你介绍了一些这样的客户。我们将在下面的例子中使用Insomnia,但是在Insomnia, Postman或任何其他类似的客户端之间没有实质性的区别。

但是首先,我们需要创建一个API密钥,它将用于独占访问这个数据库API。这是通过首先创建角色然后将角色分配给an应用程序。接下来我们来处理这个。

创建角色

随着时间的推移,你的DreamFactory实例可能会管理多个api。您可能希望对这些API进行竖井访问,为每个API创建一个或多个API键。这些API密钥将被配置为允许访问一个或一些API,但很可能不是所有API。要实现这一点,您将创建一个角色与一个或多个服务相关联,然后将该角色分配给应用程序。应用程序只是将API键连接到角色的一种简单方法。

要创建角色,单击角色位于屏幕顶部的标签:

假设这是你第一次创建一个角色,系统会提示你创建一个,如下面的截图所示:

单击创建一个角色!按钮,系统将提示您输入角色名称和描述。与服务名不同的是,角色名仅供人类使用,因此请确保将其命名为描述性的名称,例如MySQL的作用。下一步,单击访问选项卡。在这里,系统将提示您识别应该与此服务关联的API。默认界面如下图所示:

服务选择框包含到目前为止您定义的所有api,包括每个DreamFactory实例中自动包含的一些api (系统api_docs等等)。选择mysql服务。现在事情变得非常有趣了。在选择mysql服务,单击组件选择框。您将看到此选择框包含通过此API公开的所有资产的列表!如果你离开组件选择设置为,那么角色就可以访问所有的api资产。但是,您可以自由地限制角色对一个或多个资产的访问_table /员工/ *。这将限制该角色对只是上执行CRUD操作员工表!此外,使用访问选择框时,可以限制角色可以使用哪些方法,只进行选择得到,只有帖子,或其任何组合。

如果您想添加对另一个资产的访问,甚至是对另一个服务的访问,只需单击先进的过滤器头,你会看到一个额外的行添加到接口:

使用新行将另一个服务和/或已分配的服务组件分配给角色。在屏幕截图中,您可以看到该角色已被授予对mysql服务的员工表的只读访问部门表格

对角色配置满意后,按保存按钮,创建角色。完成这些之后,是时候创建一个新的应用程序了,它将被分配一个API密钥并附加到这个角色。

创建应用

下面让我们创建一个应用程序,通过单击应用程序位于界面顶部的标签:

单击创建选项卡创建一个新的应用程序。你会看到下面的表格:

让我们浏览每个表单字段:

  • 应用程序名称而且描述:应用程序名称和描述仅供人类使用,因此请随意填写。
  • 活跃的:此复选框可用于切换API密钥的可用性,该API密钥将在应用程序保存时生成并显示给您。
  • 应用程序位置:该字段为指定应用程序的位置提供了四个选项。绝大多数用户都会选择不需要存储空间因为API密钥将与移动或web应用程序一起使用,或者通过服务器端脚本使用。
  • 分配默认角色筛选器:我们的一些客户在他们的梦工厂环境中管理着数十个甚至数百个角色!为了帮助他们快速找到特定的角色,我们添加了这个实时过滤功能,它将调整页面中显示的内容指定默认角色选择框。你可以暂时把这个空着。
  • 指定默认角色:在这里,您可以将新创建的角色分配给应用程序。单击此选择框并选择角色。

单击保存按钮和新的API密钥将被生成。单击新API键旁边的剪贴板图标以选择该键,然后将其复制到剪贴板,因为在下一节中,我们将使用它与API交互。

与API交互

我们将用一系列示例来结束本章,这些示例旨在帮助您熟悉与数据库支持的API交互的多种方式。对于这些例子,我们将使用Insomnia HTTP客户端(在第二章中介绍),但是你可以使用任何类似的客户端甚至cURL来实现相同的结果。

检索所有记录

让我们从检索一个特定表的所有记录开始,就像在API Docs示例中所做的那样。打开您的客户端,并在地址栏设置URL为/ api / v2 / {service_name} / {table_name},替换{service_name}使用API的名称和{table_name}使用在数据库中找到的表的名称(以及您的API键的关联角色有权访问的表)。在本章的剩余部分,我们将使用mysql作为服务nam,在这个特定的例子中,我们要查询的表被调用员工所以URL看起来是这样的:

http://localhost/api/v2/_table/employees

另外,因为我们正在检索方法将设置为的记录得到

接下来,我们需要设置定义API键的头。这个头应该被命名X-DreamFactory-Api-Key。您可能需要在您的HTTP客户端中寻找一段时间才能找出它放在哪里,但我们保证它肯定在那里。在《Insomnia》中,标题是通过地址栏下方的标签添加的:

URL和报头就绪后,请求URL,你应该会看到以JSON格式返回的表记录:

等价的SQL查询是这样的:

SELECT * FROM employee;

限制结果

类中找到的所有记录员工表格但是如果您只想返回5条或10条记录呢?您可以使用限制参数来执行此操作。修改你的URL如下所示:

http://localhost/api/v2/_table/employees?limit=10

等价的SQL查询是这样的:

SELECT * FROM employees LIMIT 10;

补偿结果

方法中找到的结果将受到上述示例的限制员工表到10,但是如果您想选择记录11 - 21呢?你可以使用抵消参数如下:

http://localhost/api/v2/_table/employees?limit=10&offset=10

等价的SQL查询是这样的:

SELECT * FROM employees LIMIT 10 OFFSET 10;

排序结果

控件可以按任意列对结果进行排序订单参数。例如订购员工TAB由列出字段,修改你的URL如下所示:

http://localhost/api/v2/_table/employees?order=emp_no

等价的SQL查询如下所示:

SELECT * FROM employee ORDER BY emp_no;

按降序排序,只需追加desc订单字符串:

http://localhost/api/v2/_table/employees?order=emp_no%20desc

注意空格分隔列出而且desc已被HTML编码。大多数编程语言都提供原生或通过第三方库的HTML编码功能,因此您不需要在应用程序中手动执行此操作。等价的SQL查询如下所示:

SELECT * FROM employee ORDER BY emp_no DESC;

选择特定字段

通常情况下,您只需要在一个表中找到的几个字段。要限制返回的字段,请使用字段参数:

http://localhost/api/v2/_table/employees?fields=emp_no%2Clast_name

等价的SQL查询如下所示:

SELECT emp_no, last_name FROM employees;

按条件过滤记录

属性按特定条件筛选记录过滤器参数。例如,只返回具有性别等于,设置过滤器参数如下:

性别= http://localhost/api/v2/_table/employees?filter=(米)

等价的SQL查询如下所示:

SELECT * FROM性别为“M”的员工;

您可以自由地使用任何典型的比较运算符,例如就像

http://localhost/api/v2/_table/employees?filter= (last_name % 20像% 20克% 25)

等价的SQL查询如下所示:

SELECT * where last_name LIKE 'G%';

结合参数

当将多个参数组合在一起时,REST API的功能才真正开始发挥作用。例如,让我们查询员工表以仅检索具有last_name开始G,将结果按列出

http://localhost/api/v2/_table/employees?filter= (last_name % 20像% 20克% 25)与秩序=列出

等价的SQL查询如下所示:

SELECT * where last_name LIKE 'G%'

按主键查询

您通常希望使用唯一定义该记录的列来选择该记录。通常(但不总是)这个唯一的值是主键。你可以通过将值附加到URL中来检索一条记录,就像这样:

/ api / v2 / _table /供应/ 45

等价的SQL查询如下所示:

SELECT * where id = 5;

如果希望使用此URL格式搜索未定义为主键的另一个惟一值,则需要另外传递id_field而且id_type如下字段:

/ api / v2 / _table /员工/ 45 abchdkd吗?id_field = guid&id_type =字符串

连接表

DreamFactory最有趣的数据库相关特性之一是对表连接的自动支持。当DreamFactory创建一个数据库支持的API时,它会解析所有的数据库表,尽可能地学习关于表的一切,包括列名、属性和关系。这些关系被分配了别名,并在DreamFactory中作为参考目的呈现模式选项卡。类关联的关系别名列表,如下面的屏幕截图包含员工表:

使用这些别名和相关的参数,我们可以很容易地通过API返回连接的记录集。例如,下面的URI将用于加入员工而且部门表:

/ api / v2 / mysql / _table /员工?相关= dept_emp_by_emp_no

等价的SQL查询如下所示:

SELECT * FROM employees LEFT在员工中加入部门。Emp_no =部门。Emp_no;

连接的结果将在一个与别名名称匹配的JSON数组中显示:

{“列出”:10001年,“birth_date”:“1953-09-02”,“first_name”:“格奥尔基”、“last_name”:“Facello”、“性别”:“M”,“hire_date”:“1986-06-26”,“birth_year”:“1953”,“dept_emp_by_emp_no”:[{“列出”:10001年,“dept_no”:“d005”、“from_date”:“1986-06-26”,“to_date”:“9999-01-01”}]}

插入记录

要插入记录,您将发送一个帖子请求到API,传递json格式的有效负载。方法中添加一条新记录供应表,我们会发送一个帖子请求到以下URI:

/ api / v2 / mysql / _table /供应

主体负载看起来像这样:

{"resource": [{"name": "订书机"}]}

如果请求成功,DreamFactory将返回一个200状态码和包含记录主键的响应:

{"resource": [{"id": 9}]}

向多个表中添加记录

通常情况下,您希望创建一个新记录并将其与另一个表关联。这可以通过一个HTTP请求实现。考虑以下两个表。第一,供应,管理公司用品清单(订书机,扫帚等)。公司要求所有的供应都在公司数据库中被密切跟踪,所以另一张表,位置,是为此目的而创建的。中的每个记录位置类中找到的记录的位置名称和外键引用供应表格

表模式是这样的:

CREATE TABLE ' supplies ' (' id ' int(11) unsigned NOT NULL AUTO_INCREMENT, ' name ' varchar(255) DEFAULT NULL,主键(' id ')) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;CREATE TABLE ' locations ' (' id ' int(11) unsigned NOT NULL AUTO_INCREMENT, ' supply_id ' int(10) unsigned NOT NULL, ' name ' varchar(255) DEFAULT NULL, PRIMARY KEY (' id '), KEY ' supply_id ' (' supply_id '), CONSTRAINT ' locations_ibfk_1 ' FOREIGN KEY (' supply_id ') REFERENCES ' supplies ' (' id ')) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;

还记得在上一个例子中,DreamFactory将创建方便的连接别名,可以与相关的参数。在本例中,别名为locations_by_supply_id。与新事物一起创造关系供应记录,我们将使用该别名在有效负载中嵌套位置名称,如下所示:

{“资源”:[{“名称”:“扫帚”、“locations_by_supply_id”:[{" name ": "杂物室 " } ] } ] }

有效负载整理好后,剩下的就是向供应表端点:

/ api / v2 / mysql / _table /供应

如果嵌套插入成功,您将收到一个200返回状态码,以及新插入的主键ID供应记录:

{"resource": [{"id": 15}]}

更新记录

在DreamFactory中,更新数据库记录是一件简单的事情。但是,要这样做,首先需要确定要执行哪种类型的REST更新。支持两种:

  • :请求将替换现有资源的全部。这意味着你需要传递所有而不管属性值是否实际被修改。
  • 补丁:补丁请求只更新现有资源的一部分,这意味着您只需要提供资源主键和您想要更新的属性。这通常是一种更方便的更新方法当然,两者都有各自的优点。

让我们研究一下涉及每种方法的更新示例。

使用PUT更新记录

当使用你需要寄过来所有请求有效负载中的记录属性:

{“资源”({:“列出”:500015年,“birth_date”:“1900-12-15”,“first_name”:“约翰尼”,“last_name”:“足球”,“性别”:“m”,“hire_date”:“2007-01-01”}]}

有效载荷就位后,你会发送一个员工表端点:

/ api / v2 / mysql / _table /员工

如果成功,DreamFactory将返回一个200状态码和包含已更新记录主键的响应体:

{"resource": [{"emp_no": 500015}]}

等价的SQL查询如下所示:

SET first_name = 'Johnny', last_name = 'Football',生日= '1900-12-15',性别= 'm', hire_date = '2007-01-01' WHERE emp_no = 500015;

使用PATCH更新记录

类中找到的与特定记录关联的一个或多个(但不是全部)属性供应表,你会发送一个补丁供应表端点,带有主键:

/ api / v2 / mysql / _table /供应/ 8

假设供应表包含属性,如名字描述,purchase_date,但我们只想修改名字价值。JSON请求体看起来像这样:

{"name": "银色订书机"}

如果成功,DreamFactory将返回一个200状态码和包含已更新记录主键的响应体:

{"id": 8}

等价的SQL查询如下所示:

SET name = ' Silver Stapler ' WHERE id = 8;

删除记录

要删除一条记录,你需要发送一个删除请求到与要删除的记录关联的表端点。方法中删除一条记录员工表,你将引用这个URL:

/ api / v2 / mysql / _table /员工/ 500016

如果删除成功,DreamFactory将返回一个200状态码和一个包含被删除记录的主键的响应体:

{"resource": [{"emp_no": 500016}]}

等价的SQL查询如下所示:

DELETE FROM employees WHERE emp_no = 500016;

同步两个数据库的记录

通过向找到原始数据的数据库API端点添加pre_process事件脚本,可以轻松地在两个数据库之间同步记录。为此,导航到Scripts选项卡,选择所需的数据库API,然后下钻到所需的端点。例如,如果我们想从名为mysql的数据库API中名为employees的表中检索一条记录,并将其发送到另一个名为contacts的数据库API (mysql, SQL Server等),并且拥有一个名为names的表,我们将在Scripts接口中深入到以下端点:

Mysql > Mysql ._table。{table_name}> mysql._table.{table_name}.get.post_process mysql._table.employees.get.post_process

在此之后,您将选择所需的脚本语言。在这个示例中,我们选择了PHP,但是您可以了解更多关于其他可用脚本引擎的信息在维基文档中。启用活跃的复选框,并将以下脚本添加到美化的代码编辑器中:

//将$platform['api']数组值赋给一个方便的变量$api = $platform['api'];//声明几个数组供以后使用$options = [];$record = [];//获取响应体它包含返回的记录。$responseBody = $event['response']['content'];//剥离第一个(可能是唯一的)记录$employee = $responseBody["resource"][0];//剥离员工记录的first_name和last_name值,并将它们分配给两个数组键,分别命名为first和last。美元(“资源记录 "] = [ [ ' 第一' = >美元员工(“first_name”),“去年”= >员工(“last_name”),美元]];//确定$record将被POST到的位置//并执行API POST调用。 $url = "contacts/_table/names"; $post = $api->post; $result = $post($url, $record, $options);

保存更改,确保脚本的活跃的复选框已启用。然后打电话给员工表,返回一条记录,例如:

/ api / v2 / mysql / _table /员工?过滤器=列出= 10001

当然,没有什么可以阻止您修改脚本逻辑以遍历返回的记录数组。

混淆表端点

有时,您可能希望完全混淆dreamfactory生成的数据库API端点,并为用户提供一个URI,例如/ api / v2 /员工而不是/ api / v2 / mysql / _table /员工。同时,您不希望限制执行所有常规CRUD任务的能力。幸运的是,使用脚本化服务可以轻松完成这一任务。下面的示例展示了分配了命名空间的脚本PHP服务的代码员工

$api = $平台['api'];$get = $api->get;$post = $api->post;$put = $api->put;$patch = $api->补丁;$delete = $api->删除;$api_path = 'mysql/_table/employees';$method = $event['request']['method'];$options = [];$params = $event['request']['parameters']; $result = ''; $resource = $event['response']['content']['resource']; if ($resource && $resource !== '') { $api_path = $api_path + '/' . $resource; } if ($event['request']['payload']) { $payload = $event['request']['payload']; } else { $payload = null; } switch ($method) { case 'GET': $result = $get($api_path, null, $options); break; case 'POST': $result = $post($api_path, $payload, $options); break; case 'PUT': $result = $put($api_path, $payload, $options); break; case 'PATCH': $result = $patch($api_path, $payload, $options); break; case 'DELETE': $result = $delete($api_path, $payload, $options); break; default: $result = "error"; break; } return $result;

有了这个脚本,现在可以使用下面的端点与MySQL API交互员工表:

https://dreamfactory.example.com/api/v2/employees

发出一个得到对该端点的请求将返回所有记录。发出一个帖子对这个端点的请求正文如下所示,将插入一条新记录:

{“资源”({:“列出”:500037年,“birth_date”:“1900-12-12”,“first_name”:“乔”,“last_name”:“德州”、“性别”:“m”,“hire_date”:“2007-01-01”}]}

故障排除

如果您想查看MySQL数据库正在执行哪些查询,您可以启用查询日志记录。首先创建一个名为query.log在你的Linux环境中/var/log/mysql目录:

mysql $ sudo touch query.log

接下来,确保MySQL守护进程可以写入日志。注意,您可能必须调整下面的用户和组修改文件权限命令来适应您的特定环境:

$ sudo chown mysql。mysql/var/log/mysql/query.log $ sudo chmod u+w /var/log/mysql/query.log

最后,运行以下两个命令打开查询日志:

mysql> SET GLOBAL general_log_file = '/var/log/mysql/query.log';mysql> SET GLOBAL general_log = 'ON';查询OK, 0行受影响(0.00秒)

要实时查看已执行的查询,尾巴查询日志:

$ tail -f /var/log/mysql/query.log /usr/sbin/mysqld, Version: 5.7.19-0ubuntu0.16.04.1 ((Ubuntu))。Tcp端口:3306 Unix套接字:/var/run/mysqld/mysqld.袜子Id命令参数2019 - 03 - 28 t14:50:19.758466z 76退出2019 - 03 - 28 t14:50:31.648530z 77 homestead@dreamfactory.test联系员工使用TCP / IP 2019 - 03 - 28 t14:50:31.648635z 77查询使用的员工2019 - 03 - 28 t14:50:31.648865z 77准备设置名称“use utf8”核对“utf8_unicode_ci”2019 - 03 - 28 t14:50:31.648923z 77执行组名称“use utf8”核对“utf8_unicode_ci”2019 - 03 - 28 t14:50:31.649029z 77支撑2019 - 03 - 28 t14:50:31.649305z 77准备选择“first_name”,' hire_date ' from ' employees '。' employees ' limit 5 offset 0 2019-03-28T14:50:31.649551Z 77执行select ' first_name ', ' hire_date ' from ' employees '。' employees ' limit 5 offset 0 2019-03-28T14:50:31.649753Z 77关闭stmt 2019-03-28T14:50:31.696379Z 77退出

检查用户凭据

许多数据库API生成问题都是由于一组配置错误的用户凭证引起的。这些凭证必须拥有能够从梦工厂所在的IP地址进行连接的权限。要确认您的用户可以从DreamFactory服务器连接,请创建一个名为mysql-test.php的文件,并将以下内容添加到其中。取代主机名DBNAME用户名,密码您的凭证占位符:

<?php $dsn = "mysql:host=HOSTNAME;dbname= dbname ";$user = "用户名";$passwd = "密码";$pdo =新的pdo ($dsn, $user, $passwd);$stmt = $pdo->查询("SELECT VERSION()");$version = $stmt->fetch();Echo $version[0]。PHP_EOL;

保存更改并像这样运行脚本:

$ PHP mysql-test.php 5.7.29-0ubuntu0.16.04.1

如果MySQL版本号没有返回,则用户无法远程连接。

记录数据库查询

如果希望查看由DreamFactory生成的数据库查询,可以打开.env在“数据库设置”中,你会看到以下内容:

# DB_QUERY_LOG_ENABLED = false

取消注释并将其设置为真正的,并设置APP_LOG_LEVEL =调试。每当进行数据库查询时,语句将被发送到日志文件(在存储/日志/ dreamfactory.log).日志的典型输出如下所示:

(2021 - 05 - 28 - t05:47:10.965487 + 00:00)当地。调试:API事件处理:mysqldb._table.{table_name}.get。pre_process [2021-05-28T05:47:10.966765+00:00] local。调试:API事件处理:mysqldb._table.employees.get。pre_process [2021-05-28T05:47:12.388272+00:00] local。调试:服务。mysqldb:select `emp_no`, `birth_date`, `first_name`, `last_name`, `gender`, `hire_date` from `xenonpartners`.`employees` limit 2 offset 0: 1385.25 [2021-05-28T05:47:12.392063+00:00] local.DEBUG: API event handled: mysqldb._table.{table_name}.get.post_process [2021-05-28T05:47:12.393794+00:00] local.DEBUG: API event handled: mysqldb._table.employees.get.post_process

向数据库查询中添加自定义日志消息

当使用脚本化服务时,使用DB_QUERY_LOG_ENABLED设置为真正的,可以使用以下语法添加自定义日志消息:

使用日志;...if (config('df.db.query_log_enabled')) {\Log::debug(<您的消息>);}……

看到在这里有关日志记录的更多信息。

结论

恭喜你!在不到一个小时的时间内,您就成功地生成、保护并部署了一个数据库支持的API。在下一章中,您将学习如何向api添加额外的身份验证和授权解决方案。

Baidu
map