国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

快速學(xué)習(xí)nodejs系列:十三、nodejs實(shí)現(xiàn)restful api、cookie、session

asce1885 / 590人閱讀

摘要:在前面的節(jié)課程里面,我們已經(jīng)基本學(xué)習(xí)完了的知識(shí),達(dá)到基礎(chǔ)入門的要求。英語的直譯就是表現(xiàn)層狀態(tài)轉(zhuǎn)移。的特點(diǎn)不加密用戶可刪除可被修改依賴于用戶禁用或清除時(shí),讀取出錯(cuò)。下節(jié),會(huì)開始學(xué)習(xí)框架。

在前面的12節(jié)課程里面,我們已經(jīng)基本學(xué)習(xí)完了nodejs的知識(shí),達(dá)到基礎(chǔ)入門的要求。
那為什么會(huì)在這節(jié)說下使用nodejs來實(shí)現(xiàn)一些功能,而不繼續(xù)往下講呢?原因有2:
1.前面講地都是理論知識(shí),碼代碼比較少,所以在這節(jié)要總體地運(yùn)用下前面學(xué)習(xí)的知識(shí),寫點(diǎn)小demo;
2.這節(jié)寫的demo都是通過原生的nodejs去寫,沒有涉及到任何的框架。這是我覺得,通過原生的方式去寫,大家在后面學(xué)習(xí)框架的時(shí)候,在能體會(huì)到框架的好處,通過與原生的對(duì)比,大家也能更好地理解、掌握框架。

1.restful api
REST -- REpresentational State Transfer,英語的直譯就是“表現(xiàn)層狀態(tài)轉(zhuǎn)移”。看到這個(gè),有沒覺得完成不知道是啥。
其實(shí)restful api 可以理解為:通過URL定位資源找到我們的資源,用HTTP的方法(GET,POST,PUT,DELETE)來描述操作。
比如:我們?cè)陂_發(fā)過程中會(huì)遇到用戶管理的問題,假設(shè)我們對(duì)用戶管理的api為:http://www.xxx.com/user

restful的風(fēng)格如下:
用戶注冊(cè)(新增用戶信息)----使用post方式,對(duì)http://www.xxx.com/user這個(gè)ur...
用戶信息(查看用戶信息)----使用get方式,對(duì)http://www.xxx.com/user?user_...
用戶修改(修改用戶信息)----使用put方式,對(duì)http://www.xxx.com/user這個(gè)ur...
用戶刪除(刪除用戶信息)----使用delete方式,對(duì)http://www.xxx.com/user這個(gè)ur...
我們對(duì)同一個(gè)url地址,通過不同的http方式達(dá)到不同操作要求;我覺得restful相對(duì)于其他形式實(shí)現(xiàn)的api(通過定義不同的url名子、同一url帶上不同的參數(shù)等)的優(yōu)點(diǎn)是:url定義地很少了、前后端對(duì)接更清晰了(特別是在前后分離的情況之下)。當(dāng)然了,你也可以根據(jù)你們團(tuán)隊(duì)習(xí)慣去開發(fā),不一定要使用restful,只是建議!

現(xiàn)在我們就用nodejs來實(shí)現(xiàn)這個(gè)api:

//引入http模塊
var http = require("http");
//引入url模塊
var url = require("url");
//desc 實(shí)現(xiàn)一個(gè)http服務(wù)器,server、req、res分別是Server、IncomingMessage、ServerResponse類的實(shí)例
var server = http.createServer((req,res)=>{

//路由設(shè)計(jì)
//把url字符串變成url對(duì)象
let urlObj = url.parse(req.url,true);
if(urlObj.pathname == "/user"){
    //restful實(shí)現(xiàn)的關(guān)鍵,判斷http的請(qǐng)求方式
    switch(req.method){
        //get
        case "GET":
        //設(shè)置http狀態(tài)碼和Content-Type頭
        res.writeHead(200,{"Content-Type":"application/json"});
        //end()只能調(diào)用一次,且內(nèi)容是字符串,其中${urlObj.query.user_id}是es6語法
        res.end(`{"error":0,"errMsg":"收到的user_id=${urlObj.query.user_id}"}`);
        break;

        //post
        case "POST":
        //nodejs怎么去獲取前端post過來的請(qǐng)求體呢?
        //1.通過事件(events)實(shí)例,nodejs很多實(shí)例都是events實(shí)例(如IncomingMessage實(shí)例就是),我們現(xiàn)在用這種方法
        //2.借助body-parser等中間件,學(xué)習(xí)框架用這種方法
        let postData = "";
        req.setEncoding("utf8");//設(shè)置編碼
        req.on("data",(chunk)=>{//監(jiān)聽data事件,不斷讀取數(shù)據(jù)
            postData += chunk;
        });
        req.on("end",()=>{//監(jiān)聽end事件,讀取完觸發(fā)
            //原樣返回給前端
            res.writeHead(200,{"Content-Type":"application/json"});
            res.end(postData);
        });
        break;
    }
}

});
//監(jiān)聽3000端口
server.listen(3000);

postman請(qǐng)求結(jié)果:

cookie/session
cookie:
第一次訪問一個(gè)服務(wù)器,不會(huì)帶上cookie,必須是服務(wù)器得到這個(gè)請(qǐng)求,在下行的響應(yīng)報(bào)文頭中,會(huì)帶上cookie的信息,以后每次訪問該服務(wù)器時(shí)都會(huì)帶上該cookie。
cookie的特點(diǎn):1.cookie不加密、2.用戶可刪除、3.cookie可被修改
session:
session依賴于cookie,用戶禁用或清除cookie時(shí),session讀取出錯(cuò)。與cookie不同的是:session的數(shù)據(jù)是存在服務(wù)器中,生成session的時(shí)候同時(shí)會(huì)生成session_id存在cookie中,在獲取session的時(shí)候利用該session_id讀取。

設(shè)置cookie

第一次訪問:


第一次訪問時(shí),響應(yīng)報(bào)文頭設(shè)置了cookie:Set-Cookie:name=nodejs;而讀取是undefined;
再次訪問:

請(qǐng)求報(bào)文頭,會(huì)帶上cookie,而這次也讀取到了cookie值

小爬蟲
我們就爬思否的首頁(yè)的文章數(shù)據(jù),思否別打我!??!都是為了學(xué)習(xí)。
在這個(gè)例子中,爬蟲其實(shí)主要是要分析html的結(jié)構(gòu),根據(jù)結(jié)構(gòu)解析、提取出想要的數(shù)據(jù)。當(dāng)然了,有些網(wǎng)站你還要繞過它的登錄驗(yàn)證等,不會(huì)很用容易就可以爬取到。
通過分析思否的列表的結(jié)構(gòu)如下:

通過對(duì)div結(jié)構(gòu)的分析:
每個(gè)list都在news-item這個(gè)類中(id在data-id屬性中),主要的內(nèi)容在news__item-info這個(gè)類中,標(biāo)題在news__item-title類中,文章簡(jiǎn)介在article-excerpt類中,作者在author類中。

var http = require("http");
var https = require("https");
var cheerio = require("cheerio");
//實(shí)現(xiàn)一個(gè)http服務(wù)器
var server = http.createServer((req,res)=>{

//https客戶端,讀取https://segmentfault.com/數(shù)據(jù),這里不能用http去讀取
https.get("https://segmentfault.com/",(result,err)=>{
    //result 可讀流
    if(err){
        //有錯(cuò)誤直接返回錯(cuò)誤提示
        return ;
    }
    //獲取html的頁(yè)面結(jié)構(gòu)數(shù)據(jù)
    result.setEncoding("utf8");
    let rawData = "";
    //定義個(gè)數(shù)組來存放解析后的數(shù)據(jù)
    let dataArr = [];
    result.on("data",(chunk)=>{ rawData += chunk;});
    result.on("end",()=>{
        //讀取完后對(duì)html的dom結(jié)構(gòu)進(jìn)行解析,這里要用到cheer模塊(類似于jquery)
        let $ = cheerio.load(rawData);
        //用類似jquery的語法讀取數(shù)據(jù)
        $(".news-item").each((i,item)=>{
            let itemObj = $(".news-item").eq(i);
            let id = itemObj.attr("data-id");
            let title = itemObj.children(".news__item-info").children("a").children(".mb5").children().text();
            let remark = itemObj.children(".news__item-info").children("a").children(".article-excerpt").text();
            let author = itemObj.children(".news__item-info").children(".news__item-meta").children().eq(2).children().eq(0).text();
            dataArr.push({id,title,remark,author});//es6的對(duì)象簡(jiǎn)化寫法
        });
        console.log(dataArr);
        //返回
        res.end(JSON.stringify(dataArr));
    });
});

});
//監(jiān)聽3000端口
server.listen(3000);

postman的結(jié)果:

上圖返回的就是想要的爬蟲數(shù)據(jù),如果這時(shí)你也要做內(nèi)容服務(wù)的應(yīng)用,你就相當(dāng)于有數(shù)據(jù)源了,可以展示在你的應(yīng)用中了。

注意:上面的這些小demo,我們使用了一些第3方模塊:cookies、cheerio,這些你是要到npmjs.com下載才能使用,并不是nodejs的官方模塊。

下節(jié),會(huì)開始學(xué)習(xí)express框架。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/98731.html

相關(guān)文章

  • nodejs-local-api

    摘要:一簡(jiǎn)述近期,在學(xué)習(xí)期間,由于需要造數(shù)據(jù),想到弄數(shù)據(jù)庫(kù)麻煩,就直接用文件代替了,想到不錯(cuò),主要還是,所以就試著寫了寫,嘿嘿,能用。 一、簡(jiǎn)述 近期,在學(xué)習(xí)vue期間,由于需要造數(shù)據(jù),想到弄數(shù)據(jù)庫(kù)麻煩,就直接用json文件代替了,想到nodejs不錯(cuò),主要還是js,所以就試著寫了寫,嘿嘿,能用。 二、實(shí)現(xiàn) 實(shí)現(xiàn)使用的技術(shù):Nodejs + Express 4.x + ejs + boo...

    Karrdy 評(píng)論0 收藏0
  • 前端面試題大集合:來自真實(shí)大廠的532道面試題(只有題,沒有答案)

    答案自己谷歌或百度找。 一、來源背景 面試題是來自微博@牛客網(wǎng)發(fā)布的真實(shí)大廠前端面經(jīng)題目,我一直在收集題目長(zhǎng)期一個(gè)一個(gè)的記錄下來的,可能會(huì)有重復(fù),但基本前端的面試大綱和需要掌握的知識(shí)都在其中了,面試題僅做學(xué)習(xí)參考,學(xué)習(xí)者閱后也要用心鉆研其中的原理,重要知識(shí)需要系統(tǒng)學(xué)習(xí)、透徹學(xué)習(xí),形成自己的知識(shí)鏈。 二、532道前端真實(shí)大廠面試題 express和koa的對(duì)比,兩者中間件的原理,koa捕獲異常多種情...

    Kerr1Gan 評(píng)論0 收藏0
  • 前端面試題大集合:來自真實(shí)大廠的532道面試題(只有題,沒有答案)

    答案自己谷歌或百度找。 一、來源背景 面試題是來自微博@牛客網(wǎng)發(fā)布的真實(shí)大廠前端面經(jīng)題目,我一直在收集題目長(zhǎng)期一個(gè)一個(gè)的記錄下來的,可能會(huì)有重復(fù),但基本前端的面試大綱和需要掌握的知識(shí)都在其中了,面試題僅做學(xué)習(xí)參考,學(xué)習(xí)者閱后也要用心鉆研其中的原理,重要知識(shí)需要系統(tǒng)學(xué)習(xí)、透徹學(xué)習(xí),形成自己的知識(shí)鏈。 二、532道前端真實(shí)大廠面試題 express和koa的對(duì)比,兩者中間件的原理,koa捕獲異常多種情...

    lushan 評(píng)論0 收藏0
  • 前端面試題大集合:來自真實(shí)大廠的532道面試題(只有題,沒有答案)

    答案自己谷歌或百度找。 一、來源背景 面試題是來自微博@??途W(wǎng)發(fā)布的真實(shí)大廠前端面經(jīng)題目,我一直在收集題目長(zhǎng)期一個(gè)一個(gè)的記錄下來的,可能會(huì)有重復(fù),但基本前端的面試大綱和需要掌握的知識(shí)都在其中了,面試題僅做學(xué)習(xí)參考,學(xué)習(xí)者閱后也要用心鉆研其中的原理,重要知識(shí)需要系統(tǒng)學(xué)習(xí)、透徹學(xué)習(xí),形成自己的知識(shí)鏈。 二、532道前端真實(shí)大廠面試題 express和koa的對(duì)比,兩者中間件的原理,koa捕獲異常多種情...

    joyvw 評(píng)論0 收藏0
  • NodeJs+Express+Mysql + Vuejs 項(xiàng)目實(shí)戰(zhàn) - 大綱

    摘要:多一個(gè)技能多一條出路,祝你在自學(xué)道路上越走越好,掌握自己的核心技能,不只是優(yōu)秀,還要成為不可替代的人 NodeJs+Express+Mysql + Vuejs 項(xiàng)目實(shí)戰(zhàn) 最近準(zhǔn)備寫一系列文章,全面講述如何基于NodeJs + Express + Mysql + Vuejs 從零開發(fā)前后端完全分離項(xiàng)目; 文筆及技術(shù)可能在某些方面欠佳,請(qǐng)您指正,共同學(xué)習(xí)進(jìn)步 前端:Vuejs全家桶 后端:...

    noONE 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<