經(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的地址
我們來輸出運行一下看看吧步氏!
然后响禽,我的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)在的值吧贮竟!
可以看到成功的獲取到了,這個就是我的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下面添加幾個頁面
接下來我們根據(jù)路徑請求一下服務器
我們試著去請求一個不存在的頁面
我們?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的頁面,如果不是艾少,就去處理消息
啟動服務器卡乾,我們重新請求之前找不到的地址,看看有什么變化
接下來幔妨,我們優(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ā)悉抵,請關注我,學習更多騷操作胀莹!