http协议在学习node的http模块之前,先了解一下http协议。HTTP协议(HyperTextTransferProtocol,超文本传输??协议)是一种用于将超文本从WWW服务器传输到本地浏览器的传输协议。它是一种基于TCP的应用层协议。它不关心数据传输的细节,主要用于指定客户端和服务器之间的数据传输格式,最初用于向客户端传输HTML页面的内容。默认端口为80。HTTP协议通常承载在TCP协议之上,有时也会承载在TLS或SSL协议层。这时候就变成了我们常说的HTTPShttp消息请求报文。请求消息由请求行、请求头、实体内容组成。请求头以键值对的形式存在,即字段名:value;请求行指定请求方式、请求URL、协议版本;内容实体是要传输的数据。例如访问www.baidu.com的请求头:响应消息HTTP响应消息也由三部分组成:响应行、响应头、响应体。例如访问www.baidu.com的响应头:http状态码状态码用于告知客户端服务器处理请求的结果。通过状态码,用户可以知道服务器是成功处理请求、失败还是被转发。post和getpost和get方法是我们比较常用的http请求方法。get:使用get方法时,将query字符串添加到url地址中,一起发送给服务器:www.baidu.com/s?wd=http&ie=utf-8可以缓存get请求,get请求会保存在浏览器的浏览历史中get请求的URL可以保存为浏览器书签。get请求有长度限制。get请求主要用于获取数据。2.post:使用POST方式时,query字符串单独存在于post信息中,与http请求一起发送给服务器。表单数据一般以post的形式提交。无法缓存发布请求。发布请求不会保存在浏览器的浏览历史中。post请求的URL不能保存为浏览器书签。post请求没有长度限制。Node.js中一个非常重要的核心模块。使用http.createServer方法创建一个http服务器,使用http.request方法创建一个http客户端。简单的Web服务器http.server是一个基于事件的HTTP服务器,其中所有请求都被封装到单独的事件中。lethttp=require('http');//创建web服务器,提供服务,处理客户端请求//正常监听letserver=http.createServer((req,res)=>{//reqrequested通过客户端相关信息,res返回响应信息leturl=req.url;//解决中文乱码res.writeHead(200,{'Content-Type':'text/plain;charset=utf-8'});res.end('访问路径:'+url);}).listen(9000);//请求事件监听/*server.on('request',(req,res)=>{console.log(req.url);//设置响应头信息res.writeHead(200,{'Content-Type':'text/html'});res.write('HHHHH
');});server.listen(9000);*///当TCP建立连接时,触发该事件,并提供一个参数socket,它是net.socket(底层协议对象)的一个实例server.on('connection',(req,socket,head)=>{console.log('connected');});可以在浏览器中通过http://localhost:9000/访问:http.ServerRequsethttp请求分为请求头和请求体。如果请求的内容比较少,可以直接在请求头协议完成后立即读取,请求体可能比较长,需要一定的时间来传输。因此,提供了三个事件来控制请求体的传输:数据。当请求体数据到达时,事件被触发。该事件有一个参数chunk,代表接收到的数据。结尾。当请求体数据传输完成时触发该事件,之后将不再有数据到达。关闭。当用户当前请求结束时触发此事件。与end不同,如果用户强行终止传输,也会触发close。ServerRequest常用信息:lethttp=require('http');letserver=http.createServer((req,res)=>{//是否发送客户端请求console.log(req.complete);//http协议Versionconsole.log(req.httpVersion);//connnectionconsole.log(req.socket);//http请求头console.log(req.headers);//http请求方法console.log(req.method);res.writeHead(200,{'Content-Type':'text/plain'});res.write("hahahaha");res.end();}).listen(9000);get是直接拦截get请求Embedded在路径中,URL的完整请求路径包括?后面的部分,所以我们可以手动解析后面的内容作为get的参数。Nodejs的url模块中的parse函数提供了这个功能。consthttp=require('http');consturl=require('url');constutil=require('util');http.createServer((req,res)=>{//使用url模块解析clients客户端发送的URLres.write(util.inspect(url.parse(req.url,true)));res.end();}).listen(9000);postpost请求的内容都在requestbody中,http.ServerRequest没有属性content作为requestbody,因为等待requestbody的传输可能是一个耗时的任务,比如:上传文件。恶意的post请求会极大的消耗服务器资源,所以Node不会解析请求体,需要的时候需要手动解析。//获取post请求数据consthttp=require('http');constutil=require('util');constquerystring=require('querystring');http.createServer((req,res)=>{letpost='';req.on('data',chunk=>{post+=chunk;});req.on('end',()=>{post=querystring.parse(post);res.end(util.inspect(post));});}).listen(9000);http.ServerResponsehttp.ServerResponse用于向用户发送响应结果,由http.Server的请求事件发送,作为第二个参数。response.writeHead(statusCode,[headers]):将响应头发送给请求客户端response.write(data,[encoding]):将相应的内容发送给请求客户端,data为buffer或string,encoding为编码后的内容回复。end([data],[encoding]):结束响应并通知用户所有发送已完成。当所有要返回的内容发送完毕后,必须调用一次该函数。如果不调用,客户端将一直处于等待状态。url模块在开发过程中,我们可以通过正则表达式获取url地址的某一部分。url模块提供了一些用于url处理和解析的实用函数。由consturl=require('url');引入url.parse()进行分解。
