node.js基礎(三)

個人博客搭建完成,歡迎大家來訪問哦
黎默丶lymoo的博客

http模塊深入

http協(xié)議

http: 超文本傳輸協(xié)議,所有路由都是通過它來傳輸眶俩,通過它能夠構建一個客戶端與服務端連接的管道
http模塊: 能夠構建服務器環(huán)境(模擬客戶端)

創(chuàng)建服務器

類似node.js基礎(一)文章中提到的

var http = require("http");
var url = require("url");
var server = http.createServer(function (req, res) {
    console.log(req.url);    // 打印請求的路徑
    console.log(req.method); // 打印請求的方法
    res.end("結束本次請求");
});
server.listen(8080);

實例1

使用from表單進行簡單的前后臺交互
首先創(chuàng)建三個文件,index.htmlform.html以及http.js(名字隨意,具體是了解如何實現(xiàn))彪标。
index.html文件內容

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>首頁</title>
    </head>
    <body>
        <h1>首頁</h1>
        <a href="form.html">跳轉到登錄注冊頁</a>
    </body>
</html>

form.html文件內容

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Title</title>
    </head>
    <body>
        <form action="">
            用戶名:<input type="text" name="user"><br/>
            密碼:<input type="password" name="pass"><br/>
            <input type="submit" value="提交" />
        </form>
    </body>
</html>

http.js文件內容

var http = require("http");
var url = require("url");
var fs = require("fs");
var server = http.createServer(function (req, res) {
    var urlObj = url.parse(req.url, true);
    if (urlObj.pathname == "/" || urlObj.pathname == "/index.html") {
        // 把本項目中的index.html讀出來,寫進響應res中
        var rs = fs.createReadStream("index.html");
        rs.pipe(res);
    } else if (urlObj.pathname == "/form.html") {
        fs.createReadStream("form.html").pipe(res);
        console.log(urlObj.query); // 輸出用戶名和密碼
    } else {
        // 如果輸出來亂碼的同學可以加上下面這句話
        res.writeHead(200, {"Content-Type": "text/html;charset=utf-8"});
        res.end("結束本次請求");
    }
});
server.listen(8080);

至此可以試一下打開http.js的模擬服務器掷豺,在瀏覽器輸入http://localhost:8080 進行一下相關操作看一下效果吧捞烟。

首頁效果

表單頁效果

返回結果圖

最終效果在終端能夠如圖所示就大功告成了,但是這里只有簡單的兩個頁面交互当船,如果有許許多多的頁面题画,每個頁面都要去else if判斷一下是不是太麻煩了,這里有個較為簡便的方法德频,在http.js的文件中將else if改為如下:

else if (urlObj.pathname != "/favicon.ico") {
    fs.createReadStream("." + urlObj.pathname).pipe(res);
}

這樣就不用寫很多pathname去一一匹配了~是不是很方便呢苍息!
這里默認的傳輸方式是通過GET,那如果是POST該怎么寫呢壹置?

實例2

使用from表單的POST傳輸方式進行簡單的前后臺交互
還是實例1中的三個文件竞思,將form.html文件的form標簽里的屬性更改為

<form action="/post" method="post">

然后再將http.js更改為如下

var http = require("http");
var url = require("url");
var fs = require("fs");
var queryString = require("querystring");
var formidable = require("formidable");
var server = http.createServer(function (req, res) {
    var urlObj = url.parse(req.url, true);
    if (urlObj.pathname == "/" || urlObj.pathname == "/index.html") {
        var rs = fs.createReadStream("index.html");
        rs.pipe(res);
    } else if (urlObj.pathname == "/post") {
        res.writeHead(200, {"Content-Type": "text/html;charset=utf-8"});
        // 處理post傳進來的數(shù)據(jù)
        var str = "";
        req.on("data", function (chunk) {
        str += chunk;
    });
    req.on("end", function () {
        var query = queryString.parse(str);
        console.log(query);
    });
        res.end("你請求的地址是" + urlObj.pathname);
    } else if (urlObj.pathname != "/favicon.ico") {
        fs.createReadStream("." + urlObj.pathname).pipe(res);
    }
});
server.listen(8080);

這樣最終效果同GET方式一樣能夠獲取到填寫的用戶名和密碼,并且最終頁面返回的結果是“你請求的地址是/post”

實例3

使用from表單的POST傳輸方式進行簡單的圖片上傳的操作
這里同樣是上述的三個文件钞护,在form.html文件中加上上傳文件的標簽

<input type="file" name="fileup">

http.js中也添加一段對post傳輸文件的操作盖喷,代碼如下:

else if (urlObj.pathname == "/post") {
    // 處理上傳文件
    var form = new formidable.IncomingForm();
    form.parse(req, function (err, fields, files) {
        // fields: 是提交過來的字段
        // files: 是提交過來的文件對象,文件會存儲在臨時路徑
        var rs = fs.createReadStream(files.fileup.path);
        // 將文件從臨時路徑存放到指定目錄下
        var ws = fs.createWriteStream("./upload/" + files.fileup.name);
        rs.pipe(ws);
    });
    res.writeHead(200, {"Content-Type": "text/html;charset = utf-8"});
    res.end("你請求的地址是" + urlObj.pathname);
}

此時可以測試一下上傳一張圖片看看能否在upload目錄下找到同樣的圖片~

實例4

ajax請求的發(fā)送與接收
這里就不需要form.html文件了难咕,將index.html加上一段script標簽進行ajax請求發(fā)送课梳,代碼如下:

<script>
    window.onload = function () {
        var time = document.getElementById("time");
        var ajax = new XMLHttpRequest();
        ajax.open("GET", "/ajax?user=test&pass=123", true);
        ajax.send();
        ajax.onload = function () {
            time.innerHTML = ajax.responseText;
        }
    }
</script>

http.js文件中的else if后再加上一段代碼

else if (urlObj.pathname == "/ajax") {
    // 接收了ajax傳輸?shù)臄?shù)據(jù)
    console.log(urlObj.query);
}

最終同樣在瀏覽器輸入http://localhost:8080 在終端就能收到ajax發(fā)送出來的user和pass兩個字段了~

實例5

http模擬客戶端
這里我們再新建一個名為request.js的文件,這里提供get和post兩種寫法余佃,代碼如下:

var http = require("http");
get方式
var request = http.request({
    host: "localhost",
    port: "8080",
    path: "/request?user=test&pass=111",
    method: "get"
}, function (res) {
    // console.log(res.statusCode);
    res.on("data", function (chunk) {
        console.log(chunk.toString());
    });
});
request.end("請求結束"); // 結束本次請求

// post方式
var request = http.request({
    host: "localhost",
    port: "8080",
    path: "/request",
method: "post"
}, function (res) {
    // console.log(res.statusCode);
    res.on("data", function (chunk) {
        console.log(chunk.toString());
    });
});
request.write("user=test&pass=111");
request.end("請求結束"); // 結束本次請求

然后在http.js文件中再添加一段else if代碼

else if (urlObj.pathname == "/request") {
    // get方式
    console.log(urlObj.query);
    res.statusCode = 200;
    res.end('{"err": 0, "msg": "請求的內容"}');

    // post方式
    req.on("data", function (chunk) {
        console.log(chunk.toString());
    });
    res.end('{"err": 0, "msg": "請求的內容"}');
}

然后我們先開啟一下http.js這個模擬服務器暮刃,在運行request.js進行模擬請求,我們會發(fā)現(xiàn)request.js會返回出{"err": 0, "msg": "請求的內容"}爆土,然后服務器會返回出user=xxx&pass=111 請求結束椭懊。如果出現(xiàn)這種結果就說明發(fā)送成功了!
原文鏈接

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末步势,一起剝皮案震驚了整個濱河市氧猬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌立润,老刑警劉巖狂窑,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異桑腮,居然都是意外死亡泉哈,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來丛晦,“玉大人奕纫,你說我怎么就攤上這事√躺常” “怎么了匹层?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長锌蓄。 經(jīng)常有香客問我升筏,道長,這世上最難降的妖魔是什么瘸爽? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任您访,我火速辦了婚禮,結果婚禮上剪决,老公的妹妹穿的比我還像新娘灵汪。我一直安慰自己,他們只是感情好柑潦,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布享言。 她就那樣靜靜地躺著,像睡著了一般渗鬼。 火紅的嫁衣襯著肌膚如雪览露。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天乍钻,我揣著相機與錄音肛循,去河邊找鬼。 笑死银择,一個胖子當著我的面吹牛,可吹牛的內容都是我干的累舷。 我是一名探鬼主播浩考,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼被盈!你這毒婦竟也來了析孽?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤只怎,失蹤者是張志新(化名)和其女友劉穎袜瞬,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體身堡,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡邓尤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片汞扎。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡季稳,死狀恐怖,靈堂內的尸體忽然破棺而出澈魄,到底是詐尸還是另有隱情景鼠,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布痹扇,位于F島的核電站铛漓,受9級特大地震影響,放射性物質發(fā)生泄漏鲫构。R本人自食惡果不足惜浓恶,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望芬迄。 院中可真熱鬧问顷,春花似錦、人聲如沸禀梳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽算途。三九已至塞耕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間嘴瓤,已是汗流浹背扫外。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留廓脆,地道東北人筛谚。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像停忿,于是被迫代替她去往敵國和親驾讲。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理席赂,服務發(fā)現(xiàn)吮铭,斷路器,智...
    卡卡羅2017閱讀 134,651評論 18 139
  • 個人入門學習用筆記颅停、不過多作為參考依據(jù)谓晌。如有錯誤歡迎斧正 目錄 簡書好像不支持錨點、復制搜索(反正也是寫給我自己看...
    kirito_song閱讀 2,467評論 1 37
  • 2月7日晚溺欧,《中國詩詞大會》迎來了總決賽。 最后奪得桂冠的是上海00后才女武亦姝毁靶, 她才貌雙全胧奔,滿足了我們對才女的...
    小考拉俱樂部閱讀 258評論 0 0
  • 1. 不用數(shù)據(jù)驗證或數(shù)據(jù)有效性拐叉,自動生成下拉列表 方法:按【Alt+↓】組合鍵 注意點:光標要定位在已有數(shù)據(jù)區(qū)域的...
    斃考題閱讀 423評論 0 0
  • 踩著2016的尾巴岩遗,想想這一年自己的生活 ,可以用很糟糕來形容凤瘦,自己信心滿滿的教師資格證考了兩次只過了兩門宿礁,自己心...
    冉筱瀟閱讀 288評論 0 1