当前位置: 首页 > 后端技术 > Node.js

快速学习nodejs系列:十三、nodejs实现restfulapi、cookie、session、爬虫小例子

时间:2023-04-03 20:32:32 Node.js

在前面的12门课程中,我们已经基本学习了nodejs的知识,达到了基本入门的要求。那这节为什么要用nodejs来实现一些功能,而不继续讲呢?原因有2个:1、以上都是理论知识,代码代码比较少,所以在这一节中,我们应该利用前面学到的知识,写一些小的demo;2.本节写的demo都是通过原生nodejs来写的,不涉及任何框架。我的想法是这样的,用原生的方式写,以后学习框架的时候,可以体会到框架的好处,通过和原生的对比,可以更好的理解和掌握框架。1.restfulapiREST--REpresentationalStateTransfer,英文直译为“表现层的状态转移”。看到这里,是不是觉得不知道是什么?其实restfulapi可以理解为:通过URL定位资源找到我们的资源,使用HTTP方法(GET、POST、PUT、DELETE)来描述操作。例如:我们在开发过程中会遇到用户管理的问题,假设我们的用户管理API是:http://www.xxx.com/userrestful样式如下:用户注册(添加用户信息)----使用post方法访问http://www.xxx.com/user这个你...用户信息(查看用户信息)----使用get方法访问http://www.xxx.com/user?user_...用户修改(修改用户信息)----使用put方法,删除http://www.xxx.com/user这个ur...user(删除用户信息)----使用delete方法,对于http://www.xxx.com/user...的ur,对于同一个url地址,我们使用不同的http方式来实现不同的操作需求;我觉得restful相比其他形式的api(通过定义不同的url名称,同一个url上不同的参数等)的优势在于:url定义更少,前后端对接更清晰(特别是在前后端分离的情况下)。当然你也可以根据自己团队的习惯开发,不一定要用restful,只是建议!现在我们用nodejs来实现这个api://introducehttpmodulevarhttp=require("http");//introduceurlmodulevarurl=require("url");//desc实现一个httpserver,server,req和res分别是Server、IncomingMessage、ServerResponse的实例varserver=http.createServer((req,res)=>{//路由设计//将url字符串转成url对象leturlObj=url.parse(req.url,true);if(urlObj.pathname=='/user'){//restful实现的关键,判断http请求方法switch(req.method){//getcase'GET'://设置http状态codeandContent-Typeheaderres.writeHead(200,{'Content-Type':'application/json'});//end()只能调用一次,内容为字符串,其中${urlObj.query.user_id}是es6语法res.end(`{"error":0,"errMsg":"receiveduser_id=${urlObj.query.user_id}"}`);break;//postcase'POST'://nodejs如何从前端post中获取请求体//1.通过事件(events)实例,nodejs的很多实例都是事件实例(比如IncomingMessage实例),我们现在使用这个方法//2.借助body-parser等中间件,学习框架使用了这个方法letpostData='';req.setEncoding('utf8');//设置编码req.on('data',(chunk)=>{//监听data事件,连续读取数据postData+=chunk;});req.on('end',()=>{//监听结束事件,读取触发器//返回前端原样res.writeHead(200,{'Content-Type':'application/json'});res.end(postData);});休息;}}});//监听3000端口server.listen(3000);postman请求结果:cookie/sessioncookie:第一次访问服务器,不会带cookie,服务器必须拿到这个请求,下行响应头中会带上cookie信息,每次访问服务器都在future这个cookie的特性会一直带来:1.cookie没有加密,2.用户可以删除,3.cookie可以修改。Session:会话依赖于cookie。当用户禁用或清除cookie时,会话会读取错误。与cookie的区别在于会话数据存储在服务器中。当session产生时,会生成session_id并保存在cookie中,获取session时使用session_id进行读取。首次访问设置cookie:第一次访问时,在响应头中设置cookie:Set-Cookie:name=nodejs;而reading是不确定的;再次访问:requestheader会带上cookie,这也是我们第二次读取cookie的值。小爬虫爬取了师傅首页的文章数据,师傅别打我!!!一切都是为了学习。在这个例子中,爬虫其实主要是分析html的结构,根据结构解析提取想要的数据。当然,有些网站,你要绕过它的登录验证等,就不好爬了。通过分析div的结构,列表的结构如下:每个列表在类news-item中(id在data-id属性中),主要内容在类news__item-info中,标题在news__item-title类,文章介绍在article-excerpt类,作者在author类。varhttp=require("http");varhttps=require("https");varcheerio=require('cheerio');//实现一个http服务器varserver=http.createServer((req,res)=>{//https客户端,从https://segmentfault.com/读取数据,不能用http读取https.get('https://segmentfault.com/',(result,err)=>{//resultreadablestreamif(err){//如果有错误,直接返回错误信息return;}//获取html的页面结构数据result.setEncoding('utf8');letrawData='';//定义一个存储解析数据的数组letdataArr=[];result.on('data',(chunk)=>{rawData+=chunk;});result.on('end',()=>{//read分析完html的dom结构,这里使用cheer模块(类似jquery)let$=cheerio.load(rawData);//读取数据,语法类似jquery$('.news-item').each((i,item)=>{letitemObj=$('.news-item').eq(i);letid=itemObj.attr('data-id');lettitle=itemObj.children('.news__item-info').children('a').children('.mb5').children().text();letremark=itemObj.children('.news__item-info').children('a').children('.article-excerpt').text();让author=itemObj.children('.news__item-info').children('.news__item-meta').children().eq(2).children().eq(0).text();dataArr.push({id,title,remark,author});//Es6对象简化写法});console.log(dataArr);//返回res.end(JSON.stringify(dataArr));});});});//监听3000端口server.listen(3000);postman结果:上图返回想要的爬虫数据,如果你也做一个内容服务的应用,你有一个数据源,可以在你的应用中展示。注意:在上面的小demo中,我们使用了一些第三方模块:cookies,cheerio,这些是你想看的,从npmjs.com下载,不是nodejs的官方模块。下一节,我们将开始学习express框架。