前言
最近一段時(shí)間菊霜,我和我的團(tuán)隊(duì)開發(fā)了兩個(gè) APP
坚冀。
客戶端方面采用了 Flutter
,方便跨平臺(tái)鉴逞。
服務(wù)端方面劍走偏鋒记某,沒有采用 php
, pythod
, java
之類的,而是采用了與 Flutter
一樣的 Dart
語言构捡。
回顧整個(gè)過程液南,覺得自己燒(騷)的不輕,寫下這篇文章叭喜,全當(dāng)是記錄病情了贺拣。若是還有其他青年才俊蓖谢,也有 Dart
開發(fā)服務(wù)端的想法捂蕴,可以有個(gè)參考。
我為什么想到使用 Dart 開發(fā)服務(wù)端
很多開發(fā)者聽說 Dart
語言闪幽,是從 Flutter
這個(gè)客戶端開發(fā)框架開始的啥辨。
使用 Flutter
框架開發(fā)跨平臺(tái)應(yīng)用,可以最大程度保證各平臺(tái)一致性盯腌,并且與原生語言一致的使用體驗(yàn)溉知,同時(shí)提高工作效率,減少重復(fù)工作成本腕够〖墩В基于 Dart
語言,使用 Flutter
框架帚湘,目前已經(jīng)開發(fā)出了很多令人滿意的客戶端應(yīng)用玫荣,各大公司也在積極推進(jìn)這方面的工作。
實(shí)際上大诸,Dart
語言不僅僅適用于做客戶端開發(fā)捅厂,同樣的,Dart
也可以作為服務(wù)端開發(fā)资柔。
Dart
擁有的重要特性如下:
Dart
支持靜態(tài)編譯焙贷,相比較 PHP
, Pythod
等語言,可以有更高的執(zhí)行性能贿堰。
Dart
支持異步任務(wù)辙芍,相比較 Java
等,天生支持高并發(fā)羹与。
Dart
支持面向?qū)ο蠊使瑁啾容^ Go
等外遇,更容易建模和理解。
另外還有一點(diǎn)契吉,需要特別提醒:
Dart
在客戶端開發(fā)領(lǐng)域跳仿,已經(jīng)取得了有目共睹的成功,如果在服務(wù)端領(lǐng)域也采用 Dart
捐晶,可以更高復(fù)用代碼菲语,減少溝通成本,提高開發(fā)效率惑灵。
因此山上,使用 Dart
語言做服務(wù)端開發(fā),是一件非常值得嘗試的事情英支。
寫下第一行服務(wù)端代碼
在Dart
的服務(wù)端世界里佩憾,目前一切都是那么原始和荒蕪,就連WEB服務(wù)器都需要自己編寫干花。
新建 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();
}
}
上述代碼妄帘,在本地計(jì)算機(jī) 4040
端口,開啟了 HTTP
服務(wù)池凄,并且接收 HTTP
請(qǐng)求抡驼,
打開瀏覽器,訪問 localhost:4040
即可看到瀏覽器輸出 Hello, world!
代碼看起來還是很簡(jiǎn)單肿仑,不復(fù)雜致盟。
簡(jiǎn)單的路由先用起來
從上面的代碼,也能看出來尤慰, HttpRequest
就是我們?cè)跒g覽器訪問網(wǎng)頁地址的時(shí)候產(chǎn)生的馏锡,我們猜測(cè)他應(yīng)該包含的有請(qǐng)求信息。
果不其然伟端,打開 HttpRequest
的源碼杯道,你能看見很多信息,比如:
- method
- uri
- headers
- cookies
- session
- connectionInfo
可以看到荔泳,都是一些非常常見的 WEB
概念蕉饼。
其中 uri
下又有 path
, 即是請(qǐng)求路徑,也就是說:
當(dāng)你在瀏覽器里請(qǐng)求 \
路徑時(shí)候, request.uri.path 的值就是 \
當(dāng)你在瀏覽器里請(qǐng)求 \abc
路徑時(shí)候玛歌, request.uri.path 的值就是 \abc
當(dāng)你在瀏覽器里請(qǐng)求 \admin
路徑時(shí)候昧港, 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();
}
}
嗯嗯支子,這里還需要優(yōu)化创肥,先看看效果。
簡(jiǎn)單的控制器用起來
控制器一般用來接收請(qǐng)求信息,然后調(diào)用系統(tǒng)內(nèi)部代碼處理信息叹侄,最后返回響應(yīng)信息巩搏。
廢話少說,拿代碼來趾代。
新建文件 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
導(dǎo)入該控制器贯底,并且修改內(nèi)容
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();
}
嗯嗯,這里還需要優(yōu)化撒强,以后再說禽捆。
簡(jiǎn)單的數(shù)據(jù)庫操作用起來
在項(xiàng)目依賴文件 pubspec.yaml
添加新的依賴項(xiàng) mysql1: ^0.19.2
使用 mysql1
來一個(gè)簡(jiǎn)單的查詢
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,那不得掉很多頭發(fā)飘哨,簡(jiǎn)單封裝下再來
List<Column> condition = [Column('id', '=', 1)];
List<Map<String,dynamic>> list = await Db('users').where(condition).select();
print(list);
嗯嗯胚想,鏈?zhǔn)讲僮鳎闷饋矸奖愣嗔恕?/p>
總結(jié)
至此芽隆,我們使用 Dart
語言浊服,實(shí)現(xiàn)了從瀏覽器請(qǐng)求,到路由胚吁,到控制器牙躺,并且可以操作數(shù)據(jù)庫。
當(dāng)然它很簡(jiǎn)單囤采,真正用起來還需要其他工作述呐。
但是(一定要加但是),至少我們驗(yàn)證了 Dart
開發(fā)服務(wù)端的可行性蕉毯,在后端開發(fā)的技術(shù)選型上又多另一個(gè)選擇。
你們說呢思犁?