前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Dart开发服务端,我是不是发烧(骚)了?

Dart开发服务端,我是不是发烧(骚)了?

原创
作者头像
程序员汤汤
修改2021-06-28 14:36:45
3.6K2
修改2021-06-28 14:36:45
举报
文章被收录于专栏:汤哥搞开发

前言

最近一段时间,我和我的团队开发了两个 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 文件

代码语言:txt
复制
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 走起来

代码语言:txt
复制
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, 键入如下代码

代码语言:txt
复制
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 导入该控制器,并且修改内容

代码语言:txt
复制
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 来一个简单的查询

代码语言:txt
复制
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,那不得掉很多头发,简单封装下再来

代码语言:txt
复制
List<Column> condition = [Column('id', '=', 1)];

List<Map<String,dynamic>> list = await Db('users').where(condition).select();

print(list);

嗯嗯,链式操作,用起来方便多了。

总结

至此,我们使用 Dart 语言,实现了从浏览器请求,到路由,到控制器,并且可以操作数据库。

当然它很简单,真正用起来还需要其他工作。

但是(一定要加但是),至少我们验证了 Dart 开发服务端的可行性,在后端开发的技术选型上又多另一个选择。

你们说呢?

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 我为什么想到使用 Dart 开发服务端
  • 写下第一行服务端代码
  • 简单的路由先用起来
  • 简单的控制器用起来
  • 简单的数据库操作用起来
  • 总结
相关产品与服务
云服务器
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档