关于后端:Dart开发服务端我是不是发烧骚了

32次阅读

共计 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 的源码,你能看见很多信息,比方:

  1. method
  2. uri
  3. headers
  4. cookies
  5. session
  6. 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 开发服务端的可行性,在后端开发的技术选型上又多另一个抉择。

你们说呢?

正文完
 0