在浏览器输入存在的网址的一个交互过程
1.用户通过浏览器发送一个http的请求到指定的主机
2.服务器接收到该请求,对该请求进行分析和处理
3.服务器处理完成以后,返回对应的数据到用户机器
4.浏览器接收服务器返回的数据,并根据接收到的进行分析和处理
由客户端发送一个http请求到指定的服务端 -> 服务端接收并处理请求 -> 返回数据到客户端
http模块概述
引入http模块:搭建一个http的服务器,用于处理用户发送的http请求,需要使用node提供一个模块 http
var http = require('http');
创建服务器对象方法:创建并返回一个HTTP服务器对象,requestListener : 监听到客户端连接的回调函数
var server = http.createServer([requestListener]);
监听客户端请求:监听客户端连接请求,只有当调用了listen方法以后,服务器才开始工作
server.listen(port, [hostname], [backlog], [callback]); // port : 监听的端口 ,不指定端口号,系统会自动分配一个; // hostname : 主机名(IP/域名); // backlog : 连接等待队列的最大长度; // callback : 调用listen方法并成功开启监听以后,会触发一个listening事件,callback将作为该事件的执行函数
listening事件:当server调用listen方法并成功开始监听以后触发的事件
server.on('listening', function() { console.log('listening...'); })
error事件:当服务开启失败的时候触发的事件,参数err : 具体的错误对象
server.on('error', function(err){ console.log(err); });
request事件: 当有客户端发送请求到该主机和端口的请求的时候触发.
参数request : http.IncomingMessage的一个实例,通过他我们可以获取到这次请求的一些信息,比如头信息,数据等;
server.on("request",function (req,res) { console.log('有客户端请求了........'); console.log(req.headers); // 请求头信息中的数据 console.log(req.httpVersion); // 使用的http协议版本 console.log(req.url); // 请求地址,这个地址指的是域名后面的地址(路由) console.log(req.method); // 请求方式 })
参数response : http.ServerResponse的一个实例,通过他我们可以向该次请求的客户端输出返回响应
server.on("request",function (req,res) { console.log('有客户端请求了........'); // 设置返回头信息,独立进行头部信息设置,对发送的数据不会产生任何的影响 res.setHeader('miaov', 'leo'); // writeHead(statusCode, [reasonPhrase], [headers]): 这个方法只能在当前请求中使用一次,并且必须在response.end()之前调用 // 第一个参数:是状态码,用来标识服务器处理后的状态 第二个参数:是对应着第一个参数状态码的描述信息,是一个字符串,不写默认是跟状态码相对应的默认描述 // 第三个参数:是一个对象,这个参数是要告诉浏览器,我将要发送的数据类型是什么 // 这个方法最好写在write方法之前调用 res.writeHead(200, 'miaov', { 'content-type' : 'text/html;charset=utf-8' //表示要发送html的文本数据类型,浏览器会对相应的数据类型进行解析 }); // write(chunk, [encoding]) : 发送一个数据块到响应正文中(将数据写入到客户端),第一个参数:要发送的数据,第二个参数:编码(可选) res.write('<h1>hello</h1>'); // 当所有的正文和头信息发送完成以后调用该方法告诉服务器数据已经全部发送完成了,这个方法在每次完成信息发送以后必须调用,并且是最后调用 // 第一个参数:要发送的数据 第二个参数:编码,这个方法同样可以向客户端发送数据,并且发送完数据之后会结束这次请求 res.end(); })
response.end()方法产生两次访问的问题
var http = require('http'); //http是node中自带的一个模块,引入即可使用 http.createServer(function (request,response) { response.writeHead(200, {'Content-Type': 'text/html; charset=utf-8'}); if(request.url !== "/favicon.ico"){ // 清除第二次访问 console.log("访问"); response.write("hello world"); response.end("") // 不写这个方法则会没有http协议尾,写了会产生两次访问 } }).listen(9000)