前言
最近一段时间,我和我的团队开发了两个 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
开发服务端的可行性,在后端开发的技术选型上又多另一个抉择。
你们说呢?