共计 3358 个字符,预计需要花费 9 分钟才能阅读完成。
前言
最近一段时间,我和我的团队开发了两个 APP
。
客户端方面采纳了 Flutter
,不便跨平台。
服务端方面剑走偏锋,没有采纳 php
, pythod
, java
之类的,而是采纳了与 Flutter
一样的 Dart
语言。
回顾整个过程,感觉本人烧 (骚) 的不轻,写下这篇文章,全当是记录病情了。若是还有其余青年才俊,也有 Dart
开发服务端的想法,能够有个参考。
我为什么想到应用 Dart 开发服务端
很多开发者据说 Dart
语言,是从 Flutter
这个客户端开发框架开始的。
应用 Flutter
框架开发跨平台利用,能够最大水平保障各平台一致性,并且与原生语言统一的应用体验,同时进步工作效率,缩小反复工作老本。基于 Dart
语言,应用 Flutter
框架,目前曾经开发出了很多令人满意的客户端利用,各大公司也在踊跃推动这方面的工作。
实际上,Dart
语言不仅仅实用于做客户端开发,同样的,Dart
也能够作为服务端开发。
Dart
领有的重要个性如下:
Dart
反对动态编译,相比拟 PHP
, Pythod
等语言,能够有更高的执行性能。Dart
反对异步工作,相比拟 Java
等,天生反对高并发。Dart
反对面向对象,相比拟 Go
等,更容易建模和了解。
另外还有一点,须要特地揭示:
Dart
在客户端开发畛域,曾经获得了引人注目的胜利,如果在服务端畛域也采纳 Dart
,能够更高复用代码,缩小沟通老本,进步开发效率。
因而,应用 Dart
语言做服务端开发,是一件十分值得尝试的事件。
写下第一行服务端代码
在 Dart
的服务端世界里,目前一切都是那么原始和荒凉,就连 WEB 服务器都须要本人编写。
新建 main.dart
文件
import 'dart:io';
main() async {
var server = await HttpServer.bind(
InternetAddress.loopbackIPv4,
4040,
);
print('Listening on localhost:${server.port}');
await for (HttpRequest request in server) {
request.response
..write('Hello, world!')
..close();}
}
上述代码,在本地计算机 4040
端口,开启了 HTTP
服务,并且接管 HTTP
申请,
关上浏览器,拜访 localhost:4040
即可看到浏览器输入 Hello, world!
代码看起来还是很简略,不简单。
简略的路由先用起来
从下面的代码,也能看进去,HttpRequest
就是咱们在浏览器拜访网页地址的时候产生的,咱们猜想他应该蕴含的有申请信息。
果不其然,关上 HttpRequest
的源码,你能看见很多信息,比方:
- method
- uri
- headers
- cookies
- session
- connectionInfo
能够看到,都是一些十分常见的 WEB
概念。
其中 uri
下又有 path
, 即是申请门路, 也就是说:
当你在浏览器里申请 \
门路时候,request.uri.path 的值就是 \
当你在浏览器里申请 \abc
门路时候,request.uri.path 的值就是 \abc
当你在浏览器里申请 \admin
门路时候,request.uri.path 的值就是 \admin
那这是事就好办了,if
, else
走起来
import 'dart:io';
main() async {
var server = await HttpServer.bind(
InternetAddress.loopbackIPv4,
4040,
);
print('Listening on localhost:${server.port}');
await for (HttpRequest request in server) {routeHandle(request);
}
}
void routeHandle(HttpRequest request) {if (request.uri.path == '/abc') {
request.response
..write('Hello, abc!')
..close();} else if (request.uri.path == '/admin') {
request.response
..write('Hello, admin!')
..close();} else {
request.response
..write('Hello, world!')
..close();}
}
嗯嗯,这里还须要优化,先看看成果。
简略的控制器用起来
控制器个别用来接管申请信息,而后调用零碎外部代码解决信息,最初返回响应信息。
废话少说,拿代码来。
新建文件 HomeController.dart
, 键入如下代码
import 'dart:io';
class HomeController {static String index(HttpRequest request) {
// some other code
return 'hello world';
}
static String abc(HttpRequest request) {
// some other code
return 'hello abc';
}
static String admin(HttpRequest request) {
// some other code
return 'hello admin';
}
}
在 main.dart
导入该控制器,并且批改内容
import 'dart:io';
import 'HomeController.dart';
main() async {
var server = await HttpServer.bind(
InternetAddress.loopbackIPv4,
4040,
);
print('Listening on localhost:${server.port}');
await for (HttpRequest request in server) {routeHandle(request);
}
}
void routeHandle(HttpRequest request) {
String content = '';
if (request.uri.path == '/abc') {content = HomeController.abc(request);
} else if (request.uri.path == '/admin') {content = HomeController.admin(request);
} else {content = HomeController.index(request);
}
request.response
..write(content)
..close();}
嗯嗯,这里还须要优化,当前再说。
简略的数据库操作用起来
在我的项目依赖文件 pubspec.yaml
增加新的依赖项 mysql1: ^0.19.2
应用 mysql1
来一个简略的查问
ConnectionSettings settings = new ConnectionSettings(
host: 'localhost',
port: 3306,
user: 'bob',
password: 'wibble',
db: 'mydb'
);
MySqlConnection conn = await MySqlConnection.connect(settings);
var results = await conn.query('select name, email from users where id = ?', [1]);
for (var row in results) {print('Name: ${row[0]}, email: ${row[1]}');
});
间接写 SQL,那不得掉很多头发,简略封装下再来
List<Column> condition = [Column('id', '=', 1)];
List<Map<String,dynamic>> list = await Db('users').where(condition).select();
print(list);
嗯嗯,链式操作,用起来不便多了。
总结
至此,咱们应用 Dart
语言,实现了从浏览器申请,到路由,到控制器,并且能够操作数据库。
当然它很简略,真正用起来还须要其余工作。
然而(肯定要加然而),至多咱们验证了 Dart
开发服务端的可行性,在后端开发的技术选型上又多另一个抉择。
你们说呢?