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
的源码,你能看见很多信息,比如:
- 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
开发服务端的可行性,在后端开发的技术选型上又多另一个选择。
你们说呢?## 前言
最近一段时间,我和我的团队开发了两个 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
开发服务端的可行性,在后端开发的技术选型上又多另一个选择。
你们说呢?
Dart开发服务端,我是不是发烧(骚)了?的更多相关文章
- WebService-03-使用CXF开发服务端和客户端
写在前面的话 前面两节说了使用Java提供的包开发服务端和客户端,现在使用CXF来开发,CXF提供了两个类发而服务,一个是ServerFactoryBean,另一个是JaxWsServerFactor ...
- 用beego开发服务端应用
用beego开发服务端应用 说明 Quick Start 安装 创建应用 编译运行 打包发布 代码生成 开发文档 目录结构说明 使用配置文件 beego默认参数 路由设置 路由的表述方式 直接设置路由 ...
- nodejs 开发服务端 child_process 调试方法(1)
由于最近正在做一个服务端项目,采用了nodejs引擎开发,主要是master-worker工作机制;主进程可以直接调试,但是子进程调试好像有点麻烦,我没有找到好的方法; worker这里,我分拆成了几 ...
- 【笔记6-支付及订单模块】从0开始 独立完成企业级Java电商网站开发(服务端)
支付模块 实际开发工作中经常会遇见如下场景,一个支付模块,一个订单模块,有一定依赖,一个同事负责支付模块,另一个同事负责订单模块,但是开发支付模块的时候要依赖订单模块的相关类 ,方法,或者工具类,这些 ...
- nodejs 开发服务端 部署到 iis 服务器环境 -- iisnode 安装问题解决记录
开发环境 nodejs: v10.15.3 windows: 10 iis: 10 需求: 用Nodejs开发了服务端,要部署到IIS 需要在IIS服务器上安装iisnode,结果遇到问题:安装不上 ...
- Delphi 三层框架开发 服务端开发
采用Delphi7+SQL2008 一.创建数据库和表 CREATE TABLE [dbo].[tb_Department]( [FKey] [uniqueidentifier] NOT NULL, ...
- maven版cxf集合spring开发服务端(二)
一.新建一个maven项目 二.pom.xml引入依赖 <dependency> <groupId>org.apache.cxf</groupId> <art ...
- maven版cxf集合jetty开发服务端(一)
一.首先新建一个maven项目 二.pom.xml引入依赖 <dependency> <groupId>org.apache.cxf</groupId> <a ...
- 【笔记7-部署发布】从0开始 独立完成企业级Java电商网站开发(服务端)
阿里云服务 购买 连接 购买域名 域名备案 域名解析 源配置步骤 资源地址 http://learning.happymmall.com/ 配置阿里云的yum源 1.备份 mv /etc/yum.re ...
- 【笔记4-商品模块】从0开始 独立完成企业级Java电商网站开发(服务端)
分类管理模块 数据表结构设计 分类表 CREATE TABLE.mmall_ category' ( 'id' int(11) NOT NULL AUTO_ INCREMENT COMMENT ' 类 ...
随机推荐
- Elasticsearch单字段支持的最大字符数
ignore_above的作用 ES中用于设置超过设定字符后,不被索引或者存储. 当字符超过给定长度后,能否存入 keyword类型的最大支持的长度为--32766个UTF-8类型的字符. 也就是说t ...
- #css#如何使用hover,实现父对子的样式改变?
思路及做法: 鼠标移动到父盒子的时候, 里面所有的子盒子的样式都发生变化的, 只需要直接在hover后面加上空格, 并且加上子盒子的类名 ,里面再写其他样式 .父盒子的类名:hover .子盒子的类名 ...
- 第一周python作业
print("hello world") height=float(input("请输入你的身高:")) weight=float(input("请输 ...
- C#-02 传入参数的一些用法2
C#_02 参数应用2 一.关于 "ref" 局部变量和 "ref" 返回 在前面已经明白了 ref 关键词传递一个对象引用给方法调用,这样在方法中对对象修改过 ...
- 使用SqlDataReader对象从数据库中检索只读的数据。
SqlDataReader对象每次从查询结果中读取一行到内存中,对于sql数据库,如果只需要顺序读取,可以优先选择SqlDataReader,其对数据库的读取速度非常快. 调用SqlDataReade ...
- liunx之expect简介
导航: 一.expect安装.介绍.使用场景二.expect使用原理三.expect使用语法四.expect使用举例五.expect相关错误处理 - - - - - - - - - 分割线 - - - ...
- C++ 队列!还是要从 STL 中的说起……
1. 前言 队列和栈一样,都是受限的数据结构. 队列遵循先进先出的存储原则,类似于一根水管,水从一端进入,再从另一端出去.进入的一端称为队尾,出去的一端称为队头. 队列有 2 个常规操作: 入队:进入 ...
- Docker | 容器互联互通
上篇讲到创建自定义网络,我创建了 mynet 网络,并指定了网关和子网地址.在上篇结尾呢,我抛出了一个问题:其它网络下的容器可以直接访问mynet网络下的容器吗?今天就让我们一块看下怎么实现容器互联. ...
- Chrony时间同步服务
概: 网络时间协议(Network Time Protocol,NTP)是用于网络时间同步的协议.提供NTP时间同步服务的软件有很多,这里采用Chrony软件来实现时间同步 chrony 的优势: ...
- 都卷Java,你看看你得学多少技术栈才能工作!
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言:授业解惑 我知道,你不知道的还有很多! 你了解计算机要从哪里开始学习吗?你清楚为了能 ...