DreamFactory - 第3章生成数据库支持的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个数据库之一。下表列出了支持的内容的完整列表:


最重要的是,得益于DreamFactory的统一接口和API生成解决方案,您在本章中学到的所有内容都同样适用于您选择的数据库!因此,如果您已经计划使用另一个数据库,那么请务必继续使用它!

寻找更简洁的概述?查看我们的博客文章“使用DreamFactory在几分钟内创建MySQL REST API”!

是否想创建一个MySQL API但没有任何测试数据?您可以从MySQL网站下载示例数据库,其中包含与员工有关的人为数据。单击此处以了解更多信息并安装示例数据库。

生成MySQL支持的API

要生成MySQL支持的API,请使用管理员帐户登录到DreamFactory实例,然后单击“服务”选项卡:

在界面的左侧,您将看到Create按钮。单击此按钮开始生成API。您将看到一个标题为的下拉表单控件Select Service Type。您将使用此下拉列表生成新的API并配置其他身份验证选项。此菜单中有很多内容需要回顾,但目前,让我们保持跟踪Databases,然后导航至,然后MySQL:


选择MySQL后,将显示以下形式:


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

名称:名称将构成您的API URL的一部分,因此,您需要使用不带空格或特殊字符的小写字符串。此外,您通常需要选择一些可以轻松确定API目的的东西。例如,对于你的MySQL支持的API,比如你可以选择一个名字mysql,corporate或store.Keep记lowercasing名称是必需的。
标签:标签用于管理界面和与系统相关的API响应中的参考目的。您可以在这里使用一些简洁的东西,例如“ MySQL支持的企业数据库API”。
描述:与标签一样,该描述在管理界面和与系统相关的API响应中用于引用目的。
Active:确定API是否处于活动状态。默认情况下,它设置为活动,但是如果您还没有准备好开始使用API​​或以后想暂时禁用它,只需返回此屏幕并切换复选框即可。
完成这些字段后,单击Config界面顶部的选项卡。您将看到以下表单(由于篇幅太长,因此我只介绍表单的顶部):


刚开始时,此表单可能看起来有些吓人,但是在大多数情况下,您只需要填写几个字段即可。让我们先介绍一下这些内容,然后概述可选字段。

必填配置字段

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

  • 主机:数据库服务器的主机地址。这可能是IP地址或域名。
  • 端口号:数据库服务器的端口号。例如在MySQL上是3306。
  • 数据库:您要通过API公开的数据库的名称。
  • 用户名:与用于连接数据库的数据库用户帐户关联的用户名。
  • 密码:与用于连接到数据库的数据库用户帐户关联的密码。
  • 模式:如果您的数据库支持模式的概念,则可以在此处指定。MySQL不支持架构的概念,但是许多其他数据库都支持。

警告

  • 请记住,您将生成一个实际上可以与基础数据库交互的API!尽管可能很明显,但是一旦生成此API,就意味着随后发出的任何数据或架构操作请求实际上都会影响数据库。因此,在初次尝试DreamFactory时,请确保连接到测试数据库,这样就不会发出请求,以后您会后悔。

可选配置字段

在必填字段之后,您会发现许多可选参数。根据选择的数据库类型,这些类型可能并且确实会有所不同,因此,如果您在下面看到一些变化,请不要感到惊讶。此刻,您不必担心太多,因为此时您无需修改​​任何可选配置字段。但是,我们想确定一些比其他字段更常用的字段:

  • 最大记录数:您可以使用此字段为返回的记录数设置上限。
  • 启用数据检索缓存:启用缓存将大大提高性能。该字段与Cache Time to Live接下来介绍的结合使用。
  • 缓存生存时间(分钟):如果启用了数据缓存,则可以使用此字段以分钟为单位指定缓存生存期。

在完成所有必填字段以及所有所需的可选字段之后,请按Save按钮以生成您的API。片刻之后,您会看到一条弹出消息,指示Service Saved Successfully。恭喜,您刚刚生成了第一个数据库支持的API!那么,您可以用这个炫酷的新玩具做什么?请继续阅读以了解更多信息。

关于API功能的注释

大多数数据库采用用户授权系统,该系统使管理员能够在成功建立连接后准确确定用户可以执行的操作。在MySQL中,特权用于此目的。管理员可以授予和撤消用户权限,并以此来确定用户可以连接到哪些数据库,用户是否可以创建,检索,更新和删除记录以及用户是否具有管理架构的能力。

因为DreamFactory代表该用户连接到您的数据库,所以逻辑上该用户的授权功能限制了所得的API。但是,无论如何,DreamFactory都会显示完整的Swagger文档集,因此,如果您尝试通过Swagger文档或任何其他客户端与API交互,但未获得所需的结果,请确保检查数据库用户权限以确认用户确实可以执行所需的任务。

此外,请记住,这可以作为进一步锁定API的绝佳方法。尽管您稍后将学习DreamFactory,它提供了一些出色的与安全性相关的功能来限制API访问,但是当然,额外配置连接数据库用户的权限以反映所需的API功能也不会受到损害。例如,如果您打算将API设为只读,则创建具有只读授权的数据库用户。如果需要API读取和创建功能,则相应地配置用户。

通过API文档标签与您的API进行交互

Service Saved Successfully成功生成新的REST API之后出现的消息相当滑稽,因为该简单消息实际上并不能准确传达DreamFactory刚刚为您和您的团队节省了多少繁琐的工作。它不仅可以生成功能齐全的REST API,而且还可以防止未经授权的访问,还可以为所有端点生成交互式的OpenAPI文档!如果您以前从未使用过Swagger,那么您来了,因为它是一个非常了不起的工具,它使开发人员无需首先编写任何代码即可熟悉API。此外,每个端点都记录有有关输入参数和响应的详细信息。

要访问新API的文档,请点击API Docs屏幕顶部的标签:

您将看到与DreamFactory实例相关的所有文档的列表。的db,email,files,logs,system,和user文件会自动包含在所有DreamFactory实例,是非常有用的,你应该最终希望以编程方式管理您的实例。现在让我们暂时忽略这些内容,并专注于新生成的数据库文档。单击与此服务关联的表行以访问文档。屏幕上将显示以下屏幕:

滚动浏览此列表,您可以看到已经生成了许多API端点!如果为支持存储过程的数据库生成了API,则在顶部将找到名为GET /_proc/{procedure_name}和的端点POST /_proc/{procedure_name}。向下滚动,您会遇到很多用于管理模式的终结点,然后是无疑是最常用的一组CRUD(创建,检索,更新,删除)终结点。

查询表记录

让我们通过检索一组表记录来测试API。选择GET /_table/{table_name} Retrieve one or more records条目:


将打开一个滑出窗口,其中包含两个部分。第一个Parameters标识支持的请求参数。第二个是Responses,表示您期望通过响应收到的内容,包括状态码和JSON响应模板。对于GET _/table/{table_name}端点,您有许多参数可供使用,因为该端点代表查询表数据的主要方式。通过操纵这些参数,您将能够查询所有记录,或者根据其主键查询特定记录,或者根据特定条件查询记录的子集。此外,您可以使用这些参数来执行其他常见的任务,例如对记录进行分组和计数以及联接表。

要测试端点,请单击Try it out右侧的按钮。完成后,将启用输入参数字段,从而允许您输入值以修改默认查询的行为。目前,我们将只修改一个参数:table_name。它位于参数列表的最底部。输入您知道数据库中存在的表的名称,然后按蓝色Execute按钮。在按钮下方,您将看到“正在加载”图标,此后不久,将以JSON格式显示在指定表中找到的记录列表。这是在测试MySQL数据库上运行此端点时看到的示例:

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

指定的表是否存在?

如果收到500状态码,请检查服务配置凭据。该500代码几乎可以肯定意味着DreamFactory无法连接到数据库。如果一切顺利,请确保可以通过数据库端口从DreamFactory实例的IP地址连接到数据库。如果不能,则可能是防火墙问题。
API Docs界面对于熟悉API非常有用,我们鼓励您继续尝试不同的端点,以了解有关其工作原理的更多信息。但是,您最终将希望从通过API Docs接口与API交互过渡到使用第三方客户端,最终通过自己的自定义应用程序进行交互。因此,让我们现在进行下一步,并使用HTTP客户端与新API进行交互。在上一章中,向您介绍了一些这样的客户。我们将在以下示例中使用Insomnia,但是Insomnia,Postman或任何其他类似的客户端之间不会有实质性的区别。

但是首先,我们需要创建一个API密钥,该密钥将用于独占访问该数据库API。首先创建一个角色,然后将该角色分配给应用程序。接下来让我们照顾一下。

创建角色

随着时间的流逝,您的DreamFactory实例可能会管理多个API。您可能会想要孤岛访问这些API,为每个API创建一个或几个API密钥。这些API密钥将配置为允许访问一个或某些API,但很可能并非全部。为此,您将创建一个与一个或多个服务关联的角色,然后将该角色分配给应用程序。应用程序只是将API密钥连接到角色的简单方法。

要创建角色,请单击Roles屏幕顶部的选项卡:

假设这是您第一次创建角色,将提示您创建一个角色,如以下屏幕截图所示:

点击Create a Role!按钮,系统将提示您输入角色名称和描述。与服务名称不同,角色名称仅用于人类消费,因此请确保使用诸如的描述性名称MySQL Role。接下来,单击Access选项卡。在此处,系统将提示您标识应与此服务关联的API。默认界面如下图所示:

该Service选择框包含了所有的API到目前为止,您已经定义了这个,其中包括自动包含在每个DreamFactory实例(数system,api_docs等等)。选择mysql服务。现在,这里的事情变得非常有趣。选择mysql服务后,单击Component选择框。您会看到此选择框包含通过此API公开的所有资产的列表!如果将Component选择框设置为*,则该角色将有权访问所有API资产。但是,您可以通过选择例如来限制角色对一个或多个资产的访问权限_table/employees/*。这将限制此角色访问仅在employees表上执行CRUD操作的权限!此外,使用Access选择框,您可以限制角色可以使用哪些方法GET,仅选择,仅选择POST,或其任意组合。

如果您想添加对另一资产或什至另一项服务的访问权限,只需单击Advanced Filters标题旁边的加号,您将看到在界面上添加了另一行:

使用新行将其他服务和/或已分配的服务组件分配给角色。在屏幕截图中,您可以看到已授予该角色对mysql服务employees表的完全访问权限,以及对表的只读访问权限departments。

对角色的配置满意后,请按Save按钮以创建角色。完成此操作后,就该创建一个新应用程序了,该应用程序将被分配一个API密钥并附加到该角色。

创建一个应用程序

接下来,让我们创建一个应用程序,方法是单击Apps界面顶部的选项卡:


单击Create选项卡创建一个新的应用程序。您将看到以下表格:

让我们遍历每个表单字段:

  • 应用程序名称和描述:应用程序名称和描述仅用于展示使用,因此请随意填写。
  • 活动:此复选框可用于切换API密钥的可用性,该密钥将在保存应用程序时生成并显示给您。
  • 应用程序位置:此字段显示用于指定应用程序位置的四个选项。绝大多数用户会选择,No Storage Required因为API密钥将与移动或Web应用程序结合使用,或者通过服务器端脚本使用。
  • 分配默认角色过滤器:我们的一些客户在其DreamFactory环境中管理数十个甚至数百个角色!为了帮助他们快速找到特定角色,我们添加了此实时筛选功能,该功能将调整Assign a Default Role选择框中显示的内容。您可以暂时保留此空白。
  • 分配默认角色:在这里您可以将新创建​​的角色分配给您的应用程序。单击此选择框,然后选择角色。

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

与API交互

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

检索所有记录

让我们从检索特定表的所有记录开始,就像在API Docs示例中一样。打开您的客户端,然后在地址栏中将URL设置为/api/v2/{service_name}/{table_name},用{service_name}您的API {table_name}名称和在数据库中找到的表的名称(以及您的API密钥的关联角色有权访问的表)替换。在本章的其余部分中,我们将使用mysqlnam作为服务名,在此特定示例中,将调用我们正在查询的表,employees因此URL如下所示:

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

另外,由于我们正在检索记录,因此该方法将设置为GET。

接下来,我们需要设置定义API密钥的标头。此标头应命名为X-DreamFactory-Api-Key。您可能需要在HTTP客户端中徘徊片刻,以找出它的放置位置,但是我们保证一定会在其中。对于Insomnia,标题是通过地址栏正下方的选项卡添加的:

将URL和标头放置好后,请求URL,您应该看到以JSON格式返回的表记录:

等效的SQL查询如下所示:

SELECT * FROM employees;

限制数据

上一个示例返回employees表中找到的所有记录。但是,如果您只想返回五或十条记录怎么办?您可以使用limit参数来执行此操作。修改URL,使其看起来像这样:

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

等效的SQL查询如下所示:

SELECT * FROM employees LIMIT 10;

分页查询

上面的示例将您在employees表中找到的结果限制为10,但是如果要选择记录11-21,该怎么办?您将使用以下offset参数:

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

等效的SQL查询如下所示:

SELECT * FROM employees LIMIT 10 OFFSET 10;

排序操作

您可以使用order参数按任何列对结果进行排序。例如,按字段排序employees选项卡emp_no,将您的URL修改为如下所示:

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

等效的SQL查询如下所示:

SELECT * FROM employees ORDER BY emp_no;

要以降序排序,只需将附加desc到order字符串:

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

请注意,空格分隔emp_no并且desc已经过HTML编码。大多数编程语言提供本机或通过第三方库提供的HTML编码功能,因此您无需在应用程序中手动执行此操作。等效的SQL查询如下所示:

SELECT * FROM employees ORDER BY emp_no DESC;

选择特定字段

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

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

等效的SQL查询如下所示:

SELECT emp_no, last_name FROM employees;

按条件过滤记录

您可以使用filter参数按特定条件过滤记录。例如,仅返回那些gender等于的记录M,可以这样设置filter参数:

http://localhost/api/v2/_table/employees?filter=(gender=M)

等效的SQL查询如下所示:

SELECT * FROM employees where gender='M';

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

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

等效的SQL查询如下所示:

SELECT * FROM employees where last_name LIKE 'G%';

组合参数

将多个参数组合在一起时,REST API的功能真正开始发挥作用。例如,让我们查询employees表以仅检索以last_name开头的那些记录G,并对结果进行排序emp_no:

http://localhost/api/v2/_table/employees?filter=(last_name%20like%20G%25)&order=emp_no

等效的SQL查询如下所示:

SELECT * FROM employees where last_name LIKE 'G%' ORDER BY emp_no;

按主键查询

您通常需要使用唯一定义列的列来选择特定记录。通常(但不总是)此唯一值是主键。您可以通过将值附加到URL来使用其主键检索记录,如下所示:

/api/v2/_table/supplies/45

等效的SQL查询如下所示:

SELECT * FROM supplies where id = 5;

如果您想使用此URL格式来搜索另一个未定义为主键的唯一值,则需要另外传递id_field和id_type字段,如下所示:

/api/v2/_table/employees/45abchdkd?id_field=guid&id_type=string

联接表

DreamFactory与数据库最有趣的功能之一是对表连接的自动支持。当DreamFactory创建数据库支持的API时,它将解析所有数据库表,并学习有关表的所有信息,包括列名,属性和关系。关系被分配了别名,并在DreamFactory的Schema选项卡中提供以供参考。例如,以下屏幕快照包含与employees表关联的关系别名的列表:

使用这些别名和related参数,我们可以通过API轻松返回联接记录集。例如,以下URI将用于将employees和departments表连接在一起:

/api/v2/mysql/_table/employees?related=dept_emp_by_emp_no

等效的SQL查询如下所示:

SELECT * FROM employees LEFT JOIN departments on employees.emp_no = departments.emp_no;

合并结果将显示在名称与别名名称匹配的JSON数组中:

{"emp_no": 10001,"birth_date": "1953-09-02","first_name": "Georgi","last_name": "Facello","gender": "M","hire_date": "1986-06-26","birth_year": "1953","dept_emp_by_emp_no": [{"emp_no": 10001,"dept_no": "d005","from_date": "1986-06-26","to_date": "9999-01-01"}]
}

插入记录

如果要插入记录,您需要发送POST请求,并传递JSON格式的有效参数。例如,要将新记录添加到supplies表中,我们将向以下URI 发送POST请求:

/api/v2/mysql/_table/supplies

车身有效载荷如下所示:

{"resource": [{"name": "Stapler"}]
}

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

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

将记录添加到多个表

通常,您需要创建一个新记录并将其与另一个表关联。信不信由你,这可以通过一个HTTP请求来实现。请考虑以下两个表。首先,supplies管理公司供应的清单(订书机,扫帚等)。公司要求在公司数据库中密切跟踪所有供应行踪,因此locations为此创建了另一个表。locations表中的每个记录都包含一个位置名称和对supplies表中找到的记录的外键引用。

::: note我们知道在现实世界中,位置名称将在单独的表中进行管理,然后联接表会将位置和供应关联在一起;只是为了演示的目的使事情保持简单。:::

表模式如下所示:

CREATE TABLE `supplies` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT,`name` varchar(255) DEFAULT NULL,PRIMARY KEY (`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将创建方便的联接别名,可以将其与related参数结合使用。在这种情况下,该别名为locations_by_supply_id。为了在新supplies记录旁边创建关系,我们将使用该别名在有效负载中嵌套位置名称,如此处所示:

{"resource": [{"name": "Broom","locations_by_supply_id": [{    "name": "Broom Closet"}]}]
}

清理出有效负载后,剩下的就是向supplies表端点发出请求:

/api/v2/mysql/_table/supplies

如果嵌套插入成功,您将收到200状态码以及新插入supplies记录的主键ID作为回报:

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

更新记录

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

支持两种:

  • PUT:PUT请求将全部替换现有资源。这意味着您需要传递所有资源属性,而不管该属性值是否实际被修改。
  • PATCH:PATCH请求仅更新现有资源的一部分,这意味着您只需要提供资源主键和要更新的属性。PUT尽管要确保两者都有各自的优势,但这通常是比更加方便的更新方法。

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

使用PUT更新记录

更新记录时,发送PUT请求,需要包含记录的所有属性:

{"resource": [{"emp_no": 500015,"birth_date": "1900-12-15","first_name": "Johnny","last_name": "Football","gender": "m","hire_date": "2007-01-01"}]
}

放置有效负载后,您将向表端点发送一个PUT请求employees:

/api/v2/mysql/_table/employees

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

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

等效的SQL查询如下所示:

UPDATE supplies SET first_name = 'Johnny', last_name = 'Football', birthdate = '1900-12-15', gender = 'm', hire_date = '2007-01-01' WHERE emp_no = 500015

使用PATCH更新记录

要更新与supplies表中找到的特定记录相关的一个或多个(但不是全部)属性,您将向表端点发送PATCH请求supplies,并伴有主键:

/api/v2/mysql/_table/supplies/8

假设supplies表包括属性,如name,description和purchase_date,但我们只需要修改的name值。JSON请求正文如下所示:

{"name": "Silver Stapler"
}

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

{"id": 8
}

等效的SQL查询如下所示:

UPDATE supplies SET name = 'Silver Stapler' WHERE id = 8

删除记录

要删除记录,您将向与要删除的记录 发送 DELETE 请求。例如,要从employees表中删除记录,您将引用以下URL:

/api/v2/mysql/_table/employees/500016

如果删除成功,DreamFactory将返回200状态代码,其响应主体包含已删除记录的主键:

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

等效的SQL查询如下所示:

  • DELETE FROM employees WHERE emp_no = 500016;

#在两个数据库之间同步记录
通过将pre_process事件脚本添加到找到原始数据的数据库API端点,可以轻松地在两个数据库之间同步记录。为此,请导航至“脚本”选项卡,选择所需的数据库API,然后向下钻取至所需的端点。例如,如果我们要从名为mysql的数据库API中找到的名为employees的表中检索记录,并将其发送到名为contact并拥有名为name的表的另一个数据库API(MySQL,SQL Server等),我们将进行深入分析到“脚本”界面中的以下端点:

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

在那里,您将选择所需的脚本语言。在此示例中,我们选择了PHP,但是您可以在Wiki文档中了解有关其他可用脚本引擎的更多信息。启用Active复选框,然后将以下脚本添加到美化的代码编辑器中:

// Assign the $platform['api'] array value to a convenient variable
$api = $platform['api'];// Declare a few arrays for later use
$options = [];
$record = [];// Retrieve the response body. This contains the returned records.
$responseBody = $event['response']['content'];// Peel off just the first (and possibly only) record
$employee = $responseBody["resource"][0];// Peel the employee record's first_name and last_name values,
// and assign them to two array keys named first and last, respectively.
$record["resource"] = [['first' => $employee["first_name"],'last' => $employee["last_name"],]
];// Identify the location to which $record will be POSTed
// and execute an API POST call.
$url = "contacts/_table/names";
$post = $api->post;
$result = $post($url, $record, $options);

保存更改,确保Active已启用脚本的复选框。然后调用该employees表,这将导致返回一条记录,例如:

  • /api/v2/mysql/_table/employees?filter=emp_no=10001

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

故障排除

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

$ cd /var/log/mysql
$ sudo touch query.log

接下来,确保MySQL守护程序可以写入日志。请注意,您可能必须调整在以下chmod命令中找到的用户和组以适合您的特定环境:

$ 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';
Query OK, 0 rows affected (0.00 sec)mysql> SET GLOBAL general_log = 'ON';
Query OK, 0 rows affected (0.00 sec)

要实时查看您执行的查询,tail查询日志:

$ tail -f /var/log/mysql/query.log
/usr/sbin/mysqld, Version: 5.7.19-0ubuntu0.16.04.1 ((Ubuntu)). started with:
Tcp port: 3306  Unix socket: /var/run/mysqld/mysqld.sock
Time                 Id Command    Argument
2019-03-28T14:50:19.758466Z       76 Quit
2019-03-28T14:50:31.648530Z       77 Connect    homestead@dreamfactory.test on employees using TCP/IP
2019-03-28T14:50:31.648635Z       77 Query    use `employees`
2019-03-28T14:50:31.648865Z       77 Prepare    set names 'utf8' collate 'utf8_unicode_ci'
2019-03-28T14:50:31.648923Z       77 Execute    set names 'utf8' collate 'utf8_unicode_ci'
2019-03-28T14:50:31.649029Z       77 Close stmt
2019-03-28T14:50:31.649305Z       77 Prepare    select `first_name`, `hire_date` from `employees`.`employees` limit 5 offset 0
2019-03-28T14:50:31.649551Z       77 Execute    select `first_name`, `hire_date` from `employees`.`employees` limit 5 offset 0
2019-03-28T14:50:31.649753Z       77 Close stmt
2019-03-28T14:50:31.696379Z       77 Quit

结论

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

DreamFactory - 第3章生成数据库支持的API相关推荐

  1. DreamFactory 第9章 性能注意事项

    DreamFactory 第9章 性能注意事项 DreamFactory是一个基于PHP的应用程序,尽管我们会尽一切努力优化代码,但性能很大程度上取决于基础架构级别的决策.幸运的是,这些决定并不是由预 ...

  2. DreamFactory 第8章 保护您的DreamFactory环境

    DreamFactory 第8章 保护您的DreamFactory环境 DreamFactory平台建立在Laravel框架之上.Laravel是一个令人惊叹的基于PHP的框架,在短短几年内,它变得越 ...

  3. unity mysql生成cexcel_【C#附源码】数据库文档生成工具支持(Excel+Html)

    [2015] 很多时候,我们在生成数据库文档时,使用某些工具,可效果总不理想,不是内容不详细,就是表现效果一般般.很多还是word.html的.看着真是别扭.本人习惯用Excel,所以闲暇时,就简单的 ...

  4. 第十三章 数据库支持

    第十三章 数据库支持 本章讨论Python数据库API(一种连接到SQL数据库的标准化方式),并演示如何使用这个API来执行一些基本的SQL.最后,本章将讨论其他一些数据库技术. 关Python支持的 ...

  5. 超给力,抛弃手动维护,一键生成数据库文档、支持多种格式!

    点击关注公众号,实用技术文章及时了解 简介 在企业级开发中.我们经常会有编写数据库表结构文档的时间付出,从业以来,待过几家企业,关于数据库表结构文档状态:要么没有.要么有.但都是手写.后期运维开发,需 ...

  6. 第四章-分布式数据库HBase

    第四章-分布式数据库HBase 文章目录 第四章-分布式数据库HBase HBase简介 HBase数据模型 数据模型概念 概念视图 物理视图 面向列的存储 HBase实现原理 HBase功能组件 表 ...

  7. endnote初始化数据库支持_服务端编程——数据库(MySQL、sequelize) - 天生笑点低你奈我何...

    一.数据库 前端发送api请求的流程 通过API发送请求,到model进行业务处理,将数据存到或在MYSQL查询,将数据一并给KOA服务器请求,最后将请求的结果返回给客户端 关系型数据库.非关系型数据 ...

  8. 悟透delphi 第十一章 面向对象数据库基础

    第十一章 面向对象数据库基础 第二节数据对象的标识 我们在关系数据库的设计和开发中,可能经常需要一些唯一的编号或标识,用来作为关键字,以区别每一个不同的人,每一张不同的单据,每一次不同的信息登记,等等 ...

  9. java实体类生成mysql表_springboot+mybatis通过实体类自动生成数据库表的方法

    前言 本章介绍使用mybatis结合mysql数据库自动根据实体类生成相关的数据库表. 首先引入相关的pom包我这里使用的是springboot2.1.8.RELEASE的版本 org.mybatis ...

最新文章

  1. 华为提出DyNet:动态卷积
  2. 技术 | Web前端开发(4)持续更新
  3. flutter-webview的坑用到第三方插件的
  4. Eclipse 3.7 安装Maven插件时报错:requires 'bundle org.slf4j.api 1.6.2' but it could not be found...
  5. Moss2007搜索服务配置,没有索引器和搜索配置页面报错问题解决
  6. ansible之cron模块
  7. Selenium ide及webDriver使用
  8. Deepin安装Windows字体(如微软雅黑)
  9. 读论文《Toward Controlled Generation of Text》
  10. P1413 坚果保龄球洛谷c++题解
  11. P2905 [USACO08OPEN]农场危机Crisis on the Farm
  12. 科技百咖 | 志翔科技:一个“清华中老年创业天团”的故事
  13. Zabbix 3.0 版本企业微信群机器人报警
  14. No exports main defined
  15. phpRedis函数使用总结
  16. 菜鸡的秋招升级打怪之旅
  17. Navicat Premium 16安装方法
  18. 四旋翼动力学和仿真翻译(Quadcopter Dynamics and Simulation)
  19. 清华大学的计算机新世界排名,清华蝉联计算机科学AI专业全球冠军 交大排名第6...
  20. PMP考试 | 点击率最高 的100个主要知识点

热门文章

  1. 虚拟机安装mac os x实战
  2. CCTV2《今日观察》:谷歌事件美国早有预谋
  3. Node.js web应用模块之Supervisor
  4. 流量劫持能有多大危害?
  5. 用LVM管理Linux系统服务器存储空间
  6. Linux: Shell编程基础
  7. Objective-C中的一些特殊的数据类及NSLog的输出格式
  8. Python读取dat文件数据并构成Dataframe对象
  9. 剑指offer 31.栈的、压入弹出序列
  10. linux下PS1命令提示符设置