使用 Dart、Aqueduct 和 PostgreSQL 构建 RESTful Web API — 第一部分
2018年8月12日
请注意:从 Dart 2 开始,Aqueduct 的 API 已发生变更,导致一些不兼容的问题。本文基于 Dart v1 的 Aqueduct 2.5.0 版本编写。
我已经将其更新为一个新的视频系列:http://bit.ly/aqueduct-tutorial
在这个全新的 RESTful API 教程系列(#yetanotherrat)中,我们将探索 Dart 平台及其在构建服务器端应用程序方面的功能。
继我上一篇探索 Dart 语言的文章之后,我一直在研究如何使用 Dart 构建 RESTful 服务。经过一番深入研究,我偶然发现了 Stable Kernel 开发的 Aqueduct 项目。它已经发布了 2.0 版本,这让我印象深刻。而且,它的文档非常全面,示例也浅显易懂,这让我决定进一步探索。
在经历了如此富有成效且令人耳目一新的文档学习和实践经验之后,我很高兴能带您和我一起踏上这段旅程,从头到尾构建一个可用的 API!
想看视频?请在 YouTube 上观看。
那么,什么是渡槽?
它是一款用于在服务器端创建和部署 RESTful Web API 的开源框架。它与Express和Hapi,甚至 .NET Web API都有着相似之处,提供了一个入口点和一系列全面的功能。
我最喜欢的是:
- 流畅、可链式路由。一种函数式风格,用于组合路由及其处理方法。
- 一个命令行工具。它允许你通过发出命令来搭建下一个项目。
- 开箱即用的多线程功能。通过 Dart 的“隔离区”机制启动应用程序的多个实例,从而在服务器上的所有 CPU 核心上进行扩展。
- 内置ORM框架。如果您使用关系型数据库,这绝对是必备工具!同时还支持数据库迁移。
- 内置测试库。因为你需要测试所有东西!与 Travis CI 等工具兼容性良好。
在本系列教程中,我们将构建一个用于个人阅读列表(暂且称之为FaveReads 📚)的 API,内容涵盖以下主题:
- 第一部分:设置和运行示例 (我们现在在这里)
- 第二部分:使用 CRUD 操作实现路由
- 第三部分:将 Web API 连接到 SQL 数据库
- 第四部分:编写自动化测试
- *额外内容*数据库迁移和模型关系😄
设置并运行示例
如果你还没有安装 Dart SDK ,我建议你安装一下。它提供了 Windows、Mac 和 Linux 的安装说明。
您可以通过检查终端来确认 Dart 是否正在运行:
dart --version
Dart 自带一个名为pub 的工具来管理软件包。让我们使用这个工具来安装 Aqueduct:
pub global activate aqueduct
这样我们就可以访问aqueduct可执行文件了。切换到工作目录,让我们创建项目:
aqueduct create fave_reads && cd fave_reads
现在你应该位于fave_reads包含所有项目文件的目录中。接下来,我们将重点关注:
bin/
main.dart
lib/
fave_reads_sink.dart
pubspec.yaml
- bin/main.dart 创建我们的服务器并启动应用程序
- lib/fave_reads_sink.dart 文件 使用其配置来设置您的应用程序。
- pubspec.yaml 文件 包含项目的元数据,类似于 Node.js 开发中的 package.json 文件。
让我们使用以下任一命令启动应用程序:
aqueduct serve # or `dart bin/main.dart`
好了,我们开始吧:
现在我们有一个服务器正在运行,http://localhost:8081它/example是唯一创建的路由。访问http://localhost:8081/example该路由将返回以下响应:
{ "key": "value" }
在此值得一提的是,Aqueduct 具有 RequestSink 的概念,根据文档,它的作用是:
负责应用程序的初始化,包括设置路由、授权和数据库连接。
应用程序需要一个RequestSink子类才能接收请求。我们的示例继承了FaveReadsSink基RequestSink类,以便我们能够用自己的实现重写其方法。这些方法setupRouter分别是willOpen`routes` 和 `requests`。第一个方法允许我们定义路由及其关联的控制器和其他中间件,而第二个方法允许我们在路由设置完成后、应用程序接收请求之前执行任何异步初始化操作。
当前请求的默认响应类型设置为 JSON。不过,我们可以根据需要将其设置为任何合适的响应类型。
让我们通过在 setupRouter 方法中创建第二个路由来演示这一点:
router.route('/').listen((request) async {
return new Response.ok('Hello world')
..contentType = ContentType.TEXT;
});
利用方法级联,我们可以将contentType属性设置为text/plain。该ContentType实用工具内置于 Dart 中,可通过以下样式使用:
new ContentType(primaryType, subType, {String charset, Map parameters});
它已经包含了 HTML、JSON 和 TEXT 的常量,所以在大多数情况下,你应该直接使用这些常量。
现在,通过终止当前进程并重新运行来重启服务器aqueduct serve。访问根路径时,您应该会看到以下内容:
在结束之前,让我们将应用程序实例扩展到我们拥有的核心数。在bin/main.dart中,当调用 app.start 时,当前核心数设置为 2:
await app.start(numberOfInstances: 2);
为了解决这个问题,我们将从“dart:io”库导入 Dart 的Platform类,并按如下方式修改main.dart :
import 'dart:io' show Platform;
Future main() async {
...
...
await app.start(numberOfInstances: Platform.numberOfProcessors);
...
}
一些关于 VS Code 的开发技巧👈
首先,请确保通过 Dart Code 安装Dart扩展,以启用 Dart 和 Flutter 支持。
其次,添加一个 Dart 启动配置,并设置以下参数:
{
"name": "Dart",
"type": "dart",
"request": "launch",
"program": "${workspaceFolder}/bin/main.dart"
}
这样您就可以通过 VS Code 运行应用程序,并能够添加断点以帮助调试。
在结束之前,我想问大家一个问题……你们希望从这个系列文章中获得什么?请在下方留言告诉我,谢谢。
本系列第一部分到此结束。本系列的代码已上传至 GitHub,并将随着系列的推进而更新。敬请期待更多内容。
延伸阅读
文章已失效
原文发表于Medium
文章来源:https://dev.to/creativ_bracket/building-restful-web-apis-with-dart-aqueduct-and-postgresql-55k




