數據是以報文爲載體在瀏覽器與服務器之間傳輸的,報文(message)是網絡中交換與傳輸的數據單元,即站點一次性要發送的數據塊,它由三個部分組成:node
下面分別用GET請求和POST請求實現一個登陸功能,先新建http文件夾,內部新建index.js
、login.html
兩個文件。數據庫
只能傳輸少許數據(<32K,經過報文頭傳輸)。json
index.js
:segmentfault
let http = require('http') http.createServer((req, res) => { // 咱們先打印一下req.url,看看是什麼 console.log(req.url) }).listen(8080)
login.html
:數組
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>登陸</title> </head> <body> <!--action:主機+端口+被訪頁面的名稱,method:get--> <form action="http://localhost:8080/login" method="get"> 帳戶:<input type="text" name="username"><br> 密碼:<input type="password" name="password"><br> <!--type爲submit,點擊後就會觸發上面的action--> <input type="submit" value="登陸"> </form> </body> </html>
雙擊login.html訪問該頁面,帳戶輸入zhangsan
,密碼輸入123
,點擊登陸,命令行打印:/login?username=zhangsan&password=123
,說明GET請求下,表單數據經過報文頭傳輸。瀏覽器
如何獲取問號後面字符串(即query)中的各項數據呢?若是經過字符串的split方法進行分割取值的話感受很麻煩,有沒有更好的辦法?其實Node提供了一個url模塊,index.js
引入url:服務器
let http = require('http') let url = require('url') http.createServer((req, res) => { // 調用url的parse方法,傳入req.url console.log(url.parse(req.url)) }).listen(8080)
執行node index.js
,login.html
頁面輸入內容點擊登陸後,命令行打印:網絡
Url { protocol: null, slashes: null, auth: null, host: null, port: null, hostname: null, hash: null, search: '?username=zhangsan&password=123', query: 'username=zhangsan&password=123', // 注意query這一行 pathname: '/login', path: '/login?username=zhangsan&password=123', href: '/login?username=zhangsan&password=123' }
index.js
代碼作一個小改動:console.log(url.parse(req.url, true))
,即在url.parse方法中添加一個參數true
(表示將query字符串處理成對象形式),接着重複上面的步驟再執行一次,看命令行結果:函數
Url { ... query: [Object: null prototype] { username: 'zhangsan', password: '123' }, // 注意,這一行變了 ... }
如今,能夠獲取到咱們須要的pathname
和query
了(以後再去數據庫裏匹配數據,該部分類容省略)
let {pathname, query} = url.parse(req.url, true) console.log(pathname, query)
執行以後打印:
/login [Object: null prototype] { username: 'zhangsan', password: '123' }
既能接收數據,又能提交數據(<2G,經過報文體傳輸)。採用POST請求傳輸的數據可能很大,因此Node是讓這些數據分段傳輸的,服務器接收到多個數據片斷後再拼接起來使用。
index.js
:
let http = require('http')``` // 將post的數據從字符串類型轉化爲咱們須要的json類型 let querystring = require('querystring') http.createServer((req, res) => { // Node提供的on方法表示事件監聽,'data'表示傳輸的每一個數據片斷,每傳輸一段就會執行一遍on('data')方法; // post請求發送的數據不只侷限於字符串,還有圖片或文件,因此回調函數以buffer這種二進制格式做爲參數; // 由於例子中傳輸的數據長度很小,只需一個片斷,可是實際生產中片斷不少,因此用數組result去承載全部的數據片斷 let result = [] req.on('data', buffer => { console.log(buffer) // No.1 console.log(buffer.toString()) // No.2 result.push(buffer) }) // on('end')方法監聽傳輸完成,利用Bufer提供的concat方法把全部零碎片斷拼接起來 req.on('end', () => { console.log(result) // No.3 let data = Buffer.concat(result) console.log(data) // No.4 console.log(data.toString()) // No.5 console.log(querystring.parse(data.toString())) // No.6 }) }).listen(8080)
login.html
和上面的基本相同,只是將form標籤的method的值改成post
。
啓動Node服務,登陸頁面輸入zhangsan
和123
點擊登陸,命令行打印:
注:上面兩處爲buffer數據執行toString方法實際上是不嚴謹的,對於簡單數據(字符串)還能夠,可是對圖片和文件數據就沒意義了,因此僅做爲舉例說明。