更新时间:2021-12-01 来源:黑马程序员 浏览量:
HTTP服务器本质上也是一个Socket服务器,可以理解为在Socket服务器的基础上进行了一些封装,简化了一些操作。本节将对HTTP模块提供的API进行详细介绍。
1. http.Server
在Node.js中,HTTP服务器是指http.Server对象,用Node.js做的所有基于HTTP协议的系统,如网站、社交应用甚至代理服务器,都是基于http.Server实现的。它提供了一套封装级别很低的API,仅仅是流控制和简单的消息解析,所有的高层功能都要通过它的接口来实现。创建http.Server对象的语法如下:
Var server = http.createServer();
在上述代码中,使用creatServer()函数创建的server对象就是一个http.Server对象。
http.Server是一个基于事件的HTTP服务器,继承自EventEmitter,所有的请求都被封装为独立的事件,开发者只需要对它的事件编写相应函数即可实现HTTP服务器的所有功能。http.Server提供了一些函数,具体如下:
(1)server.close([callback]):服务器停止已经开始的监听。
(2) server.listen(port[, hostname][, backlog][, callback])。
server.listen参数说明如下:
●port:指定监听的端口。
● hostname:指定主机名。
●backlog:指定被允许进行排队的最大待处理连接数,默认是511。
●callback:指定该服务器已经开始在指定的端口上监听时,要执行的回调处理函数。
(3))server listen(handle[,callback])和server.listen(path[,callback]):监听文件系统的连接。第一个是监听已打开文件描述句柄,第二个是要监听一个文件的路径。除此之外,http.Server 还提供了3个事件,具体如下:
(1)request:当客户端请求到来时,该事件被触发,提供两个参数req和res,分别为http.ServerRequest和http.ServerResponse的实例,表示请求和响应信息。
(2)connection:当TCP连接建立时,该事件被触发,提供一个参数socket,为net.Socket 的实例。connection事件的粒度要大于request,因为客户端在Keep-Alive模式下可能会在同一个连接内发送多次请求。
(3)close:当服务器关闭时,该事件被触发。注意不是在用户连接断开时。除此之外,还有checkContinue、upgrade、clientError事件,通常不需要关心,只有在实现复杂的HTTP服务器时才会用到。
2. http.IncomingMessage 对象
在HTTP 服务器和客户端都会创建http.IncomingMessage对象,它一般由http.Server的request事件发送,作为第一个参数传递,通常简称为request或req。在发送HTTP 请求时,会发送请求报文,http.IncomingMessage对象实现了一个可读流,在服务器端,http.IncomingMessage 提供了一个close 事件,用户当前请求结束时,也就是底层的套接字被关闭时该事件被触发。另外,http.IncomingMessage对象中还提供了一些函数和属性,用来获取客户端请求和服务器端响应的一些信息,如下表所示。
表7-2 http.IncomingMessage 对象的常用函数和属性
函数&属性 | 说明 |
message.headers | 包含了随请求/回应发送的标头的一个对象 |
message.httpVersion | 指定用于构建客户端请求/响应的HTTP版本 |
message.setTimeout(msccs, callback) | 设置连接的以毫秒为单位的套接字超时时间,连同一个如果发生超时时被执行的回调函数 |
message.method | 指定用于请求/响应的方法 |
message. statusCode | 指定来自服务器的3位数状态码。此属性只在处理服务器响应的HTTP客户端上有效 |
message.socket | 这是一个指向net.Socket对象的句柄,用来与客户端/服务器通信 |
message.url | 发送到服务器的URL字符串,只在处理服务器中有效 |
3. http.ServerResponse
htp.ServerResponse是返回给客户端的信息,决定了用户最终能看到的结果。它也是由http.Server的request事件发送的,作为第二个参数传递,一般简称为response或res。
http.ServerResponse是一个可写流,用来给客户端的Socket发送响应报文,在服务器做出响应之前会发送响应报文,http.ServerResponse中有3个重要的成员函数,前两个用于返回对应响应报文的响应头和响应内容,最后一个用于结束请求,具体如下:
(1)response.writeHead(statusCode,[headers]):向请求的客户端发送响应头。status-Code是HTTP状态码,如200(请求成功)、404(未找到)等。headers是一个类似关联数组的对象,表示响应头的每个属性。该函数在一个请求内最多只能调用一次,如果不调用,则会自动生成一个响应头。
(2)response.write(data,[encoding]):向请求的客户端发送响应内容。data是一个Buffer或字符串,表示要发送的内容。如果data是字符串,那么需要指定encoding来说明它的编码方式,默认是utf-8。在response.end 调用之前,response.write可以被多次调用。
(3)response.end([data],[encoding]):结束响应,告知客户端所有发送已经完成。当所有返回的内容发送完毕时,该函数必须被调用一次。它接收两个可选参数,意义和response.write相同。如果不调用该函数,客户端将永远处于等待状态。除上述成员函数外,还有一些函数和属性可供开发者使用,如表7-3所示。
表7-3 http.ServerResponse其他函数和属性
函数&属性 | 说明 |
response.add Trailers(headers) | 将HTTP尾随标头写人响应的结束处 |
response.finished | 默认为false,调用end)的数方法后结果为 true |
response.getHeader(name) | 获取已在响应中设置的HTTP标头的值 |
response.headersSent | 如果标头已被发送,为true;否则为false |
response.removeHeader(name) | 移除已在响应中设置的一个HTTP标头 |
response.sendDate | 如果设置为true,则Data标头的是自动生成的,并作为响应的一部分发送 |
response.setHeader(name, value) | 设置一个特定的标头值 |
response.setTimeout(msecs, callback) | 设置客户端连接的套接字超时时间,以毫秒计,带有一个如果发生超时将被执行的回调函数 |
response.statusCode | 无须显式地写入标头来指定响应状态码 |
response.statusMessage | 当使用隐式消息头并且游息头被刷新时,这个属性控制的消息状态将被发送到客户端 |
response.writeContinueO | 发送一个HTTP/1.1100继续消息给客户端,表示请求主体应该发送 |