Node.js處理HTTP

http://nodejs.cn/api/http.html

  • HTTP 服務(wù)器和客戶端洒沦,必須引入: require('http')穷吮;

1宣增、require 引入

  • 如果有路徑就在路徑中查找(自定義的模塊)
  • 如果沒有路徑诲祸,就在node_modules中查找(npm安裝的模塊)
  • 在沒有路徑,且沒有node_modules的時候掀序,會在node的安裝目錄中查找(一般用于系統(tǒng)模塊)

2帆焕、服務(wù)器對象:

http.createServer() 快速搭建服務(wù)器(本機(jī)iP地址:127.0.0.1 域名:localhost)

let http = require("http");

http.createServer(()=>function{
    console.log("內(nèi)容")
}).listen(8081)
// .listen(8081)是監(jiān)聽要訪問的端口。
// 參數(shù)是一個回調(diào)函數(shù)不恭。啟動之后叶雹,在瀏覽器訪問這個端口,就可以執(zhí)行回調(diào)函數(shù)
  • 回調(diào)函數(shù)有兩個參數(shù)县袱,是返回給服務(wù)器的浑娜。
  • 第一個參數(shù):request 請求的時候傳遞的參數(shù)(簡寫req)
  • 第二個參數(shù):response 服務(wù)器返還的參數(shù)(簡寫res)
let http = require("http");

http.createServer((req,res)=>function{
    res.write("index"); // 返還的內(nèi)容
    res.end(); // 表示結(jié)束。

    // 可簡寫:
    // res.end("index")
}).listen(8081)

3式散、路由

  • 作用
    (1)定義method(請求方式筋遭。比如:get/post)
    (2)定義url規(guī)則(url的形式,比如:/api/list)
    (3)定義輸入(request body)和輸出(response body)

  • get :
    (1)一般用于從服務(wù)器上獲取數(shù)據(jù)
    (2)測試可用瀏覽器直接訪問

  • post :
    (1)一般用于向服務(wù)器傳送數(shù)據(jù)
    (2)測試需要借助工具—— postman

  • url:判斷獲取的url中是否有參數(shù)暴拄,可截取漓滔,例:

const http = require('http');

const server = http.createServer((req, res) => {
    const url = req.url
    // 截取url鏈接中,問號前面的部分乖篷,并賦值給path
    const path = url.split('?')[0] //后面判斷路由的時候响驴,直接使用path判斷
    const method = req.method

    console.log('url:' + url)
    console.log('method:' + method)
    // 定義路由,模擬獲取留言板
    if (path === '/api/list' && method === 'GET') {
        res.end('成功獲取')
    }

    // res.end("ceshi")
    res.end("404")

}).listen(3000)

4撕蔼、postman

  • 下載地址:https://www.postman.com/
  • 作用:這里用于測試使用psot發(fā)送請求
  • 安裝:
    win7 安裝的時候豁鲤,提示缺少Microsoft.NET秽誊, 直接點擊安裝即可。


    安裝
const http = require('http');

const server = http.createServer((req, res) => {
    const url = req.url

    const path = url.split('?')[0] //后面判斷路由的時候琳骡,直接使用path判斷
    const method = req.method

    console.log('url:' + url)
    console.log('method:' + method)
    // 定義路由锅论,模擬獲取留言板
    if (path === '/api/list' && method === 'GET') {
        res.end('成功獲取')
    }
    // 添加post方式,匹配的路由判斷 楣号,模擬創(chuàng)建留言
    if (path === '/api/create' && method === 'POST') { 
        res.end('POST成功')
    }

    // res.end("ceshi")
    res.end("404")

}).listen(3000)
POST測試

5最易、querystring

  • 形式:
    (1)在url中,問號(炫狱?)后面的都是querystring藻懒,就得說url的參數(shù)部分。例:

    querystring

    (2)若是有多個參數(shù)视译,每個參數(shù)直接使用"&"分隔嬉荆,參數(shù)是key=value的形式

  • 作用以及如何使用:
    (1)輸入不同的參數(shù),可訪問不同的頁面憎亚,不同的部分员寇。
    (2)服務(wù)端拿到querystring弄慰,根據(jù)不同的querystring返回不同的內(nèi)容第美。querystring改變的時候,對應(yīng)的內(nèi)容發(fā)生變化
    (3)注意: url中的問號陆爽,使用英文格式的什往,不然獲取的url中有EF%BC%等,例:

    問號格式錯誤

    (4)測試:
    image.png

  • querystring.parse
    (1) 引入 querystring模塊:const querystring = require('querystring');
    (2) 使用querystring.parse 能夠?qū)@取的a = 100慌闭,轉(zhuǎn)換為{a:100}的格式别威,例:
    parse

(3)url的hash,如下驴剔,"#"號后面的部分省古,不能使用parse獲取,因為hash無法傳遞到服務(wù)端丧失。


hash
  • 結(jié)構(gòu)化與非結(jié)構(gòu)化 (簡單了解即可)
    (1)結(jié)構(gòu)化的數(shù)據(jù)豺妓,易通過程序訪問和分析,比如:對象布讹、數(shù)組琳拭。
    (2)非結(jié)構(gòu)話的,不易通過程序分析描验,比如:字符串
    (3)所以一般建議白嘁,盡量使用結(jié)構(gòu)化數(shù)據(jù)

6、使用response返回數(shù)據(jù)

  • 返回json格式數(shù)據(jù)

(1)設(shè)置appLication/json
res.writeHead(200, { 'Content-type': 'appLication/json' })
(2)get請求膘流,返回json

GET

(3)post請求絮缅,返回json
POST

(4)返回字符串
res.writeHead(404, { 'Content-type': 'text/plain' })
(5)整體代碼參考如下:

const http = require('http')
const querystring = require('querystring')

const server = http.createServer((req, res) => {
    const url = req.url
    const path = url.split('?')[0]
    const queryStr = url.split('?')[1]
    const method = req.method
    const query = querystring.parse(queryStr)


    if (path === '/api/list' && method === 'GET') {

        const result = {
            errno: 0,
            data: [
                { user: '張三', content: "留言1" },
                { user: '張四', content: "留言2" }
            ]
        }
        // res.end('成功獲取')
        res.writeHead(200, { 'Content-type': 'appLication/json' })
        res.end(JSON.stringify(result))
    }

    if (path === '/api/create' && method === 'POST') {
        // res.end('POST成功')
        const result = {
            errno: 0,
            message: '創(chuàng)建成功'

        }
        res.writeHead(200, { 'Content-type': 'appLication/json' })
        res.end(JSON.stringify(result))
    }
    // 頁面返回字符串
    res.writeHead(404, { 'Content-type': 'text/plain' })
    res.end("404")

}).listen(3000)
  • 返回html格式數(shù)據(jù)(了解即可鲁沥,不使用)
    (1)設(shè)置Content-type:text/html
    (2)如下:
    返回html格式

7、使用request返回數(shù)據(jù)

  • 流:
  • 下載時:
    (1)source(服務(wù)端)耕魄,dest(前端/客服端)
    水相當(dāng)于下載的數(shù)據(jù)黍析,水管,相當(dāng)于網(wǎng)絡(luò)


    image.png

    (2)服務(wù)端 res.end(...)屎开,自動以流的形式返回給瀏覽器阐枣,瀏覽器識別到流,會持續(xù)接收信息奄抽。接收完之后蔼两,會顯示或處理。(比如:視頻一段段的加載顯示)

  • 上傳時:
    (1)source前端逞度,dest服務(wù)端
    水相當(dāng)于上傳的數(shù)據(jù)额划,水管,相當(dāng)于網(wǎng)絡(luò)
  • 識別“流”档泽,并輸出數(shù)據(jù):
const http = require('http')
const querystring = require('querystring')

const server = http.createServer((req, res) => {

    const url = req.url
    const path = url.split('?')[0]
    const method = req.method
    // const queryStr = url.split('?')[1]

    // const query = querystring.parse(queryStr)
    console.log('path:' + path)
    console.log('method:' + method)
    if (path === '/api/abc' && method === 'POST') {
        // POST請求俊戳。傳遞json數(shù)據(jù)
        // const result = {
        //     errno: 0,
        //     message: '創(chuàng)建成功'

        // }
        // res.writeHead(200, { "Content-type": 'appLication/json' })
        // res.end(JSON.stringify(result))


        // 服務(wù)端,如何去識別并接收"流"
        let bodyStr = ''
        req.on('data', chunk => {
            // chunk :"流"的每一段數(shù)據(jù)

            bodyStr += chunk.toString() // 每次流一段馆匿,將其累加抑胎,
        })

        // 服務(wù)端,如何知道"流"流完了渐北,完了之后阿逃,會執(zhí)行end方法。
        req.on('end', () => {
            console.log('bodyStr:', bodyStr)
            res.end('接收完')
        })
        // const result = {
        //     errno: 0,
        //     message: '創(chuàng)建成功'

        // }
        // res.writeHead(200, { 'Content-type': 'appLication/json' })
        // res.end(JSON.stringify(result))
    }
    // res.end('POST成功33')

}).listen(3000)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載赃蛛,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者恃锉。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市呕臂,隨后出現(xiàn)的幾起案子破托,更是在濱河造成了極大的恐慌,老刑警劉巖歧蒋,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件土砂,死亡現(xiàn)場離奇詭異,居然都是意外死亡疏尿,警方通過查閱死者的電腦和手機(jī)瘟芝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來褥琐,“玉大人锌俱,你說我怎么就攤上這事〉谐剩” “怎么了贸宏?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵造寝,是天一觀的道長。 經(jīng)常有香客問我吭练,道長诫龙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任鲫咽,我火速辦了婚禮签赃,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘分尸。我一直安慰自己锦聊,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布箩绍。 她就那樣靜靜地躺著孔庭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪材蛛。 梳的紋絲不亂的頭發(fā)上圆到,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天,我揣著相機(jī)與錄音卑吭,去河邊找鬼芽淡。 笑死,一個胖子當(dāng)著我的面吹牛陨簇,可吹牛的內(nèi)容都是我干的吐绵。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼河绽,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了唉窃?” 一聲冷哼從身側(cè)響起耙饰,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎纹份,沒想到半個月后苟跪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡蔓涧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年件已,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片元暴。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡篷扩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出茉盏,到底是詐尸還是另有隱情鉴未,我是刑警寧澤枢冤,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站铜秆,受9級特大地震影響淹真,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜连茧,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一核蘸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧啸驯,春花似錦值纱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至惰聂,卻和暖如春疆偿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背搓幌。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工杆故, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人溉愁。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓处铛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親拐揭。 傳聞我的和親對象是個殘疾皇子撤蟆,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,033評論 2 355