前言

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

你们说呢?## 前言

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

你们说呢?

Dart开发服务端,我是不是发烧(骚)了?的更多相关文章

  1. WebService-03-使用CXF开发服务端和客户端

    写在前面的话 前面两节说了使用Java提供的包开发服务端和客户端,现在使用CXF来开发,CXF提供了两个类发而服务,一个是ServerFactoryBean,另一个是JaxWsServerFactor ...

  2. 用beego开发服务端应用

    用beego开发服务端应用 说明 Quick Start 安装 创建应用 编译运行 打包发布 代码生成 开发文档 目录结构说明 使用配置文件 beego默认参数 路由设置 路由的表述方式 直接设置路由 ...

  3. nodejs 开发服务端 child_process 调试方法(1)

    由于最近正在做一个服务端项目,采用了nodejs引擎开发,主要是master-worker工作机制;主进程可以直接调试,但是子进程调试好像有点麻烦,我没有找到好的方法; worker这里,我分拆成了几 ...

  4. 【笔记6-支付及订单模块】从0开始 独立完成企业级Java电商网站开发(服务端)

    支付模块 实际开发工作中经常会遇见如下场景,一个支付模块,一个订单模块,有一定依赖,一个同事负责支付模块,另一个同事负责订单模块,但是开发支付模块的时候要依赖订单模块的相关类 ,方法,或者工具类,这些 ...

  5. nodejs 开发服务端 部署到 iis 服务器环境 -- iisnode 安装问题解决记录

    开发环境 nodejs: v10.15.3 windows: 10 iis: 10 需求: 用Nodejs开发了服务端,要部署到IIS 需要在IIS服务器上安装iisnode,结果遇到问题:安装不上 ...

  6. Delphi 三层框架开发 服务端开发

    采用Delphi7+SQL2008 一.创建数据库和表 CREATE TABLE [dbo].[tb_Department]( [FKey] [uniqueidentifier] NOT NULL, ...

  7. maven版cxf集合spring开发服务端(二)

    一.新建一个maven项目 二.pom.xml引入依赖 <dependency> <groupId>org.apache.cxf</groupId> <art ...

  8. maven版cxf集合jetty开发服务端(一)

    一.首先新建一个maven项目 二.pom.xml引入依赖 <dependency> <groupId>org.apache.cxf</groupId> <a ...

  9. 【笔记7-部署发布】从0开始 独立完成企业级Java电商网站开发(服务端)

    阿里云服务 购买 连接 购买域名 域名备案 域名解析 源配置步骤 资源地址 http://learning.happymmall.com/ 配置阿里云的yum源 1.备份 mv /etc/yum.re ...

  10. 【笔记4-商品模块】从0开始 独立完成企业级Java电商网站开发(服务端)

    分类管理模块 数据表结构设计 分类表 CREATE TABLE.mmall_ category' ( 'id' int(11) NOT NULL AUTO_ INCREMENT COMMENT ' 类 ...

随机推荐

  1. tar.gz方式安装nacos设置使用systemct进行service方式的管理并设置开机自启动--废弃不用这个

    nacos解压缩目录是:/opt/nacos 编写shell脚本 # vim /opt/nacos/bin/nacos.sh #!/bin/bash source /etc/profile workD ...

  2. Compose 模板文件

    模板文件是使用 Compose 的核心,涉及到的指令关键字也比较多.但大家不用担心,这里面大部分指令跟 docker run 相关参数的含义都是类似的. 默认的模板文件名称为 docker-compo ...

  3. PHP全栈开发(七):PHP与MySQL存储交互(1.连接、创建数据库;创建数据表)

    在Linux服务器中可以使用命令 mysqladmin -u root password beijing2007; 来修改MySQL的root用户的密码. 但是在我们自己安装了wampserver的电 ...

  4. SSM整合以及相关补充

    SSM整合以及相关补充 我们在前面已经学习了Maven基本入门,Spring,SpringMVC,MyBatis三件套 现在我们来通过一些简单的案例,将我们最常用的开发三件套整合起来,进行一次完整的项 ...

  5. 使用 Spring Security 手动验证用户

    1.概述 在这篇快速文章中,我们将重点介绍如何在 Spring Security 和 Spring MVC 中手动验证用户的身份. 2.Spring Security 简单地说,Spring Secu ...

  6. JVM中的堆

    堆 内存结构 堆的核心概念 <java虚拟机规范>中对java堆的描述是:所有的对象实例以及数组都应当在运行时分配在堆上. 一个JVM实例只存在一个堆内存(就是new 出来一个对象),ja ...

  7. sql面试50题------(21-30)

    文章目录 21.查询不同老师所教不同课程平均分从高到低显示 23.使用分段[100,85),[85,70),[70,60),[<60] 来统计各科成绩,分别统计各分数段人数:课程ID和课程名称 ...

  8. win10本地python第三方库安装成功,但是pycharm项目无法使用解决方案

    一.背景win10本地python第三方库安装成功,但是pycharm项目无法使用解决方案如本地安装的python中的request库,在pycharm项目中居然无法使用,比较郁闷 pip list ...

  9. 三、docker镜像管理

    一.docker镜像管理 1.1.镜像搜索-search 从docker镜像仓库模糊搜索镜像 用法: docker search 镜像关键字 [root@zutuanxue ~]# docker se ...

  10. Spark基本知识

    Spark基本知识 Spark 是一种基于内存的快速.通用.可扩展的大数据分析计算引擎. spark与hadoop的区别 Hadoop Hadoop 是由 java 语言编写的,在分布式服务器集群上存 ...