DartVM服務器開發(fā)(第四天)--代碼優(yōu)化

經(jīng)過三天左刽,大家已經(jīng)對DartVM服務器開發(fā)有了一個基本的認識煤蚌,可能有人會說豪嚎,處理請求這么亂的嗎锯茄?今天就來優(yōu)化一下代碼厢塘!

優(yōu)化請求

上一篇文章中,我們通過依賴第三方http_server這個包實現(xiàn)將html頁面返回給瀏覽器撇吞,但是一般的服務器都包含請求html俗冻,json格式的傳遞,這樣就有可能造成了混亂牍颈,下面我們使用http_server這個包進行優(yōu)化吧迄薄!

在上一篇文章中,有人問了相對路徑在不同的系統(tǒng)的表現(xiàn)是不一樣的煮岁,那么讥蔽,我們今天使用絕對路徑,獲取當前項目的絕對路徑是很容易的,通過下面代碼獲取

  var webPath=Platform.script.toFilePath();

這里有一個Platform類,這個類主要提供有關計算機和操作系統(tǒng)的信息画机,而PlatForm.script主要獲取當前運行腳本的絕對Uri冶伞,Uri內(nèi)容為File://地址,然后toFilePath()就是獲取當前Uri的地址
我們來輸出運行一下看看吧步氏!


pathToBuild的值.png

然后响禽,我的html路徑為
/Users/rhyme/WebstormProjects/ServerApp/webApp
那么我們怎么改為該路徑呢,下面是我的代碼

import 'package:path/path.dart';

  var webPath=dirname(dirname(Platform.script.toFilePath()))+'/webApp';

可以看到,我導入了path.dart這個文件荚醒,這個文件中有一個方法dirname().該方法可以知道芋类,獲取目錄的名字,我獲取了兩次目錄的名字界阁,就是當前項目的根目錄侯繁,然后就是拼接上"/webApp"這個字符串,就是html的存放位置了泡躯,我們來看一下現(xiàn)在的值吧贮竟!

image.png

可以看到成功的獲取到了,這個就是我的html存放路徑较剃,如果你是win系統(tǒng)咕别,也可以通過該方法去試著獲取到html存放路徑,下面就將該路徑傳入到http_server這個包的一個類中,在此之前写穴,我們昨天有人可能對下面這一段代碼有點疑問

main() async {
  VirtualDirectory staticFiles=new VirtualDirectory('.');
//.....
  }
}

對的顷级,這里的VirtualDirectory構(gòu)造方法中,我們傳入了一個“ . ”這個點就是要傳入我們的html目錄路徑了确垫,我們一定要記得弓颈,這里需要傳入絕對路徑,下面就是拼接的代碼

  var webPath=dirname(dirname(Platform.script.toFilePath()))+'/webApp';

  VirtualDirectory staticFiles=new VirtualDirectory(webPath);

接下來删掀,我們要讓VirtualDirectory這個類去接管收到的請求翔冀,并根據(jù)路徑訪問html頁面

var webPath=dirname(dirname(Platform.script.toFilePath()))+'/webApp';

  VirtualDirectory staticFiles=new VirtualDirectory(webPath);
  //允許目錄監(jiān)聽,按照目錄去請求
  staticFiles.allowDirectoryListing=true;
//目錄處理,當請求根目錄時披泪,會返回該地址
  staticFiles.directoryHandler=(dir,request){
    var indexUri=new Uri.file(dir.path,).resolve('index.html');
    staticFiles.serveFile(new File(indexUri.toFilePath()), request);
  };

  var requestServer = await HttpServer.bind(InternetAddress.loopbackIPv6, 8080);

  print('監(jiān)聽 localhost地址纤子,端口號為${requestServer.port}');

  //監(jiān)聽請求
  await for (HttpRequest request in requestServer) {
//交給staticFiles處理了
    staticFiles.serveRequest(request);
//    logUtils.writeHeaders(request);
//
//    if(request.uri.toString()=='/'||request.uri.toString().endsWith('.html')){
//
//    }else{
//      handleMessage(request);
//    }
//
  }

最后,我們在webApp下面添加幾個頁面


添加幾個頁面.png

接下來我們根據(jù)路徑請求一下服務器


頁面一.png

頁面二.png
關于頁面.png

我們試著去請求一個不存在的頁面


可以看到不存在.png

我們?yōu)闆]有找到的頁面進行定制一下

  staticFiles.errorPageHandler=(request){
    if(request.uri.pathSegments.last.contains('.html')){
      staticFiles.serveFile(new File(webPath+'/404.html'), request);
    }else{
      handleMessage(request);
    }
  };

這里我們判斷請求地址最后請求的文件是否為一個html頁面款票,如果是控硼,就為它返回一個404的頁面,如果不是艾少,就去處理消息


404頁面png

啟動服務器卡乾,我們重新請求之前找不到的地址,看看有什么變化


可以看到缚够,返回了404的頁面.png

接下來幔妨,我們優(yōu)化一下代碼
main() async {
  //獲取文件根目錄
  var webPath=dirname(dirname(Platform.script.toFilePath()))+'/webApp';
  VirtualDirectory staticFiles=new VirtualDirectory(webPath);
  //允許目錄監(jiān)聽
  staticFiles.allowDirectoryListing=true;
  //處理訪問根目錄
  staticFiles.directoryHandler=(dir,request){
    var indexUri=new Uri.file(dir.path,).resolve('index.html');
    staticFiles.serveFile(new File(indexUri.toFilePath()), request);
  };
  //處理訪問不存在的頁面
  staticFiles.errorPageHandler=(request){
    if(request.uri.pathSegments.last.contains('.html')){
      staticFiles.serveFile(new File(webPath+'/404.html'), request);
    }else{
      handleMessage(request);
    }
  };
  var requestServer = await HttpServer.bind(InternetAddress.loopbackIPv6, 8080);
  print('監(jiān)聽 localhost地址,端口號為${requestServer.port}');
  //監(jiān)聽請求
  await requestServer.forEach(staticFiles.serveRequest);
}

上面就是優(yōu)化的代碼了谍椅!
今天雖然沒有太多的知識误堡,但是一個好的代碼環(huán)境,是我們繼續(xù)維護的動力雏吭,好了锁施!今天就到此結(jié)束了,明天見杖们!

如果想繼續(xù)學習DartVM服務器開發(fā)悉抵,請關注我,學習更多騷操作胀莹!

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末基跑,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子描焰,更是在濱河造成了極大的恐慌媳否,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件荆秦,死亡現(xiàn)場離奇詭異篱竭,居然都是意外死亡,警方通過查閱死者的電腦和手機步绸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門掺逼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人瓤介,你說我怎么就攤上這事吕喘∽改牵” “怎么了?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵氯质,是天一觀的道長募舟。 經(jīng)常有香客問我,道長闻察,這世上最難降的妖魔是什么拱礁? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮辕漂,結(jié)果婚禮上呢灶,老公的妹妹穿的比我還像新娘。我一直安慰自己钉嘹,他們只是感情好鸯乃,可當我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著隧期,像睡著了一般飒责。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上仆潮,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天宏蛉,我揣著相機與錄音,去河邊找鬼性置。 笑死拾并,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的鹏浅。 我是一名探鬼主播嗅义,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼隐砸!你這毒婦竟也來了之碗?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤季希,失蹤者是張志新(化名)和其女友劉穎褪那,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體式塌,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡博敬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了峰尝。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片偏窝。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出祭往,到底是詐尸還是另有隱情伦意,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布链沼,位于F島的核電站默赂,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏括勺。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一曲掰、第九天 我趴在偏房一處隱蔽的房頂上張望疾捍。 院中可真熱鬧,春花似錦栏妖、人聲如沸乱豆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽宛裕。三九已至,卻和暖如春论泛,著一層夾襖步出監(jiān)牢的瞬間揩尸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工屁奏, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留岩榆,地道東北人。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓坟瓢,卻偏偏與公主長得像勇边,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子折联,可洞房花燭夜當晚...
    茶點故事閱讀 44,901評論 2 355

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