Dart開發(fā)服務(wù)端闸翅,我是不是發(fā)燒(騷)了?

前言

最近一段時(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 的源碼杯道,你能看見很多信息,比如:

  1. method
  2. uri
  3. headers
  4. cookies
  5. session
  6. 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è)選擇。

你們說呢思犁?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末代虾,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子激蹲,更是在濱河造成了極大的恐慌棉磨,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,542評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件学辱,死亡現(xiàn)場(chǎng)離奇詭異乘瓤,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)策泣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門衙傀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人萨咕,你說我怎么就攤上這事统抬。” “怎么了?”我有些...
    開封第一講書人閱讀 158,021評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵聪建,是天一觀的道長(zhǎng)钙畔。 經(jīng)常有香客問我,道長(zhǎng)金麸,這世上最難降的妖魔是什么擎析? 我笑而不...
    開封第一講書人閱讀 56,682評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮挥下,結(jié)果婚禮上叔锐,老公的妹妹穿的比我還像新娘。我一直安慰自己见秽,他們只是感情好愉烙,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著解取,像睡著了一般步责。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上禀苦,一...
    開封第一講書人閱讀 49,985評(píng)論 1 291
  • 那天蔓肯,我揣著相機(jī)與錄音,去河邊找鬼振乏。 笑死蔗包,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的慧邮。 我是一名探鬼主播调限,決...
    沈念sama閱讀 39,107評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼误澳!你這毒婦竟也來了耻矮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,845評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤忆谓,失蹤者是張志新(化名)和其女友劉穎裆装,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體倡缠,經(jīng)...
    沈念sama閱讀 44,299評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡哨免,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了昙沦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片琢唾。...
    茶點(diǎn)故事閱讀 38,747評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖桅滋,靈堂內(nèi)的尸體忽然破棺而出慧耍,到底是詐尸還是另有隱情身辨,我是刑警寧澤,帶...
    沈念sama閱讀 34,441評(píng)論 4 333
  • 正文 年R本政府宣布芍碧,位于F島的核電站煌珊,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏泌豆。R本人自食惡果不足惜定庵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望踪危。 院中可真熱鬧蔬浙,春花似錦、人聲如沸贞远。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蓝仲。三九已至俱病,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間袱结,已是汗流浹背亮隙。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評(píng)論 1 267
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留垢夹,地道東北人溢吻。 一個(gè)月前我還...
    沈念sama閱讀 46,545評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像果元,于是被迫代替她去往敵國(guó)和親促王。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

  • 筆者之前寫過一篇關(guān)于JDK8特性以及基于JDK8的服務(wù)端架構(gòu)設(shè)計(jì)思想(此文已丟失)噪漾,如今回頭去看硼砰,顯然當(dāng)年還是太嫩...
    蕭雨山閱讀 579評(píng)論 0 0
  • 1:=====開發(fā)步驟 項(xiàng)目是基于前后端分離的架構(gòu)進(jìn)行開發(fā),前后端分離架構(gòu)總體上包括前端和服務(wù)端欣硼,通常是多人協(xié)作并...
    lww文閱讀 1,338評(píng)論 0 1
  • 這篇文章,我將著重分析當(dāng)前主流跨平臺(tái)開發(fā)解決方案(偏架構(gòu)而非代碼)如Flutter恶阴、RN诈胜、Weex、Hybrid ...
    Man不經(jīng)心閱讀 5,607評(píng)論 0 5
  • 我是黑夜里大雨紛飛的人啊 1 “又到一年六月冯事,有人笑有人哭焦匈,有人歡樂有人憂愁,有人驚喜有人失落昵仅,有的覺得收獲滿滿有...
    陌忘宇閱讀 8,531評(píng)論 28 53
  • 信任包括信任自己和信任他人 很多時(shí)候缓熟,很多事情累魔,失敗、遺憾够滑、錯(cuò)過垦写,源于不自信,不信任他人 覺得自己做不成彰触,別人做不...
    吳氵晃閱讀 6,187評(píng)論 4 8