我们知道传统的HTTP服务器是由Aphche、Nginx、IIS之类的软件来搭建的,但是Nodejs并不需要,Nodejs提供了http模块,用于搭建 HTTP 服务端和客户端
http模块中提供了四个类和一些方法,这里只叙述这四个类和部分方法的详解
如何使用http模块
var http = require('http');
http.Server类
http.Server类是用来创建服务器的。包含的事件和属性如下:
- checkContinue事件:每次收到 HTTP Expect: 100-continue1 的请求时都会触发。如果未监听此事件,服务器将自动响应 100 Continue。在触发和处理此事件时,不会触发 ‘request’ 事件。
- checkExpectation事件:每次收到带有 HTTP Expect 请求头的请求时触发,其中值不是 100-continue。 如果未监听此事件,则服务器将根据需要自动响应 417 Expectation Failed。在触发和处理此事件时,不会触发 ‘request’ 事件。
- close事件:当服务器关闭时触发。
- connection事件:建立新的 TCP 流时会触发此事件。
- request事件:每当有请求时触发。
- listen():启动 HTTP 服务器用于监听连接。用于监听端口号
var http = require("http");
var server = new http.Server();
server.on('request',function(req,res){
res.writeHead(200,"success",{
"Content-Type":"text/plain"
});
res.write("hello nodejs","utf8");
res.end();
})
server.on('connection',function(){
console.log('hello node!');
});
server.on('close',function(){
console.log('server will close');
});
server.listen(3000);
在上述案例中,我们创建了一个简单的服务器,利用request事件监听请求信息,request事件的监听器接收两个参数。
其中req为请求内容,res为响应内容。两个参数分别是http.IncomingMessage类(它实现了可读流的接口)和http.ServerResponse类(它实现了可写流的接口)的实例
在http模块提供了一个创建服务器的封装的方法http.createServer()。
const http = require('http');
const server = http.createServer(function(req,res) {
}).listen(3000);
http.createServer()方法创建的时候自动给request事件绑定了监听器,监听器的内容是一样的。
http.ServerResponse类
http.ServerResponse类是在服务器内部创建的,用于生成服务端响应信息res,并作为第二个参数传递到request事件的监听器中。包含的事件和属性如下:
- close事件:表明响应已完成,或者其底层的连接过早被终止(在响应完成之前)。
- end([data[, encoding]][, callback]):此方法向服务器发出信号,表明已发送所有响应头和主体,该服务器应该视为此消息已完成。必须在每个响应上调用此 response.end() 方法。
- response.flushHeaders():刷新响应头
- response.setHeader(name, value):为隐式响应头设置单个响应头的值。如果此响应头已存在于待发送的响应头中,则其值将被替换。
- response.getHeader(name):返回某个响应头信息
- response.getHeaderNames():返回一个数组,返回所有设置的响应头的唯一名称
- response.getHeaders():返回当前传出的响应头的浅拷贝
- response.hasHeader(name):用于判断响应头是否设置了name 标识的响应头
- response.headersSent:判断是否已经发送了响应头。发送了则为true,反之为false
- response.removeHeader(name):删除某个响应头信息
- response.write(chunk[, encoding][, callback]):如果调用此方法并且尚未调用 response.writeHead(),则将切换到隐式响应头模式并刷新隐式响应头。这会发送一块响应主体。 可以多次调用该方法以提供连续的响应主体片段。
- response.writeHead(statusCode[, statusMessage][, headers]):向请求发送响应头。如果使用这个方法就表明响应头不使用隐式响应头模式
从上列讲述的方法和属性可以看出,ServerResponse 基本只有三个作用:返回响应头、响应内容以及结束请求
const http = require('http');
const server = http.createServer(function(req,res) {
res.writeHead(200,"success",{
"Content-Type":"text/plain"
});
res.write("hello nodejs","utf8");
res.end();
}).listen(3000);
writeHead()方法写入响应头或使用隐式响应头模式,write()向请求体中写入响应信息。每次响应信息完成后都要调用end()方法,该方法会通知服务器,所有响应头和响应主体都已被发送,即服务器将其视为响应已完成