http模块
node.js提供了http模块,其中封装了一个http服务器和一个建议的http客户端。
http.server是一个基于事件的http服务器,内部由c++实现,接口由JavaScript封装。
http.request则是一个http客户端工具,用户向服务器发送请求。
HTTP 模块提供了 5 个类:
(1)http.Agent:创建全局实例,以管理 HTTP 客户端连接的持久性和复用,
(2)http.ClientRequest:当 http.request() 或 http.get() 被调用时,会创建 http.ClientRequest 对象。
(3)http.Server:当使用 http.createServer() 创建新的服务器时,通常会实例化并返回此类。
(4)http.ServerResponse
(5)http.IncomingMessage:http.serverRqueste()
http.serve的事件
http.server是一个基于事件的http服务器,所有请求都被封装成独立的事件,开发者只有对它的事件编写相应函数,实现http服务器的所有功能。它继承于EventEmitter,提供了以下事件:
(1)request:当客户端请求到来时,该事件被触发,提供两个参数req和res,分别是http.ServerRequest和http.IncomingMessage(http.ServerResponse)的实例,表示请求和响应信息;就是我们常用的http.createServer([requestListener])模块;
(2)connection:当TCP连接建立时,该事件被触发,提供一个参数socket,为net.Socket的实例(底层协议底下)
(3)close:当服务器关闭时,该事件被触发,除此之外还有checkContinue、upgrade、clientError事件
(4)listen()启动服务器监听
server.listen(prot,host,backlog,callback) 启动服务器监听
port:监听的端口号,0表示为服务器随机分配一个端口号。
host:监听的地址,默认为本机(localhost)
backlog:指定位于等待队列中的客户端连接的最大数量。超过此数量,则服务器拒绝新的客户端请求。
callback:开启监听后触发的回调函数。当服务器开启监听后会触发listening事件,可以通过监听listening事件来代替callback回调函数。
- 创建服务器
const http = require('http'); // 1.导入 http 模块。
const server = http.createServer(); // 2.创建 web 服务器实例。
server.on('request', function(req, res) { // 3.为服务器实例绑定 request 事件,监听客户端请求。
console.log('someone visit our web server');
});
server.listen(8080, function() { // 4.启动服务器监听
console.log('server runing at http://127.0.0.1:8080');
});
server.on("connection",function(socket){ //客户端与服务器创立链接时触发connection事件 }); //监听服务器连接
2. http.IncomingMessage(http.Serverrequest)(请求的信息)
这部分主要包括请求头的设置(常用跨域设置),和请求参数的获取;
http请求分为两部分:请求头和请求体。
请求内容端的直接在请求头解析完成后立即读取,而请求体可能相对较长,需要一定的事件传输,因为提供了三个事件用于控制请求体传输:
(1)data:当请求体数据到来时,该事件被触发,该事件只有一个参数chunk,表示接受到的数据
(2)end:当请求体数据传输完成时,该事件被触发,此后将不会再有数据的到来,必须被调用。
(3)close:当前用户请求结束时,该事件被触发,不同于end,如果用户强制终止了传输,也会触发close
request常用属性:
request.method:请求的方式,值为GET/POST/PUT/DELETE
request.url:获取请求url,常与url模块解析,url.parse(request.url)。
request.headers:HTTP请求头
request.trails:HTTP请求尾(不常见)
request.httpVersion:客户端发送的HTTP版本(通常是1.0/1.1)
request.railers:客户端发送的trailers对象信息。只有IncommingMessage对象的end事件触发后才能读取到该信息。
request.complete:客户端请求是否已经发送完成
request.connection: 当前http连接套间字,为net.Socket的实例
request.socket:connection属性的别名
request.client:client属性的别名
获取get请求信息(请求头)
params = url.parse(req.url, true).query; //urls为nodejs的模块,需引入;第二个参数默认为false,设置成ture后,会返回query的对象
获取post请求信息(请求体)
//注册data事件监听函数,每当接受请求体的数据,
const body='';
request.on('data',function(chunk){
body += chunk;
});
req.on('end',function(){
Const body = querystring.parse(body); //解析成真正的body请求格式,获取的是post的body的参数;
res.end(); //
});
备注:获取url,参数常用模块
var urls = require('url');提供url的解析方法
var querystring = require('querystring');post参数转换
var util = require('util');提供格式化json的方法
3. http.ServerResponse(返回给客户端的信息)
定义用户得到的结果,包括响应头和响应数据设置
常用函数
res.writeHead(statusCode,[heasers]):向请求的客户端发送响应头,该函数在一个请求中最多调用一次,如果不调用,则会自动生成一个响应头
res.write(data,[encoding]):想请求的客户端发送相应内容,data是一个buffer或者字符串,如果data是字符串,则需要制定编码方式,默认为utf-8,在res.end调用之前可以多次调用
res.end([data],[encoding]):结束响应,告知客户端所有发送已经结束,当所有要返回的内容发送完毕时,该函数必需被调用一次,两个可选参数与res.write()相同。如果不调用这个函数,客户端将用于处于等待状态。
response.writeHead(statusCode, [headers]:向请求的客户端发送响应头
——Statuscode是http的状态码,如200为成功,404未找到等
——headers是一个类似关联数组的对象,表示响应头的每个属性
备注:
headers:响应头对象:常用字段如下:
1、Content-Type:指定返回内容类型
2、location:将客户端重定向到另一个URL地址。
3、content-disposition:指定一个被下载的文件名。
4、content-length:指定响应内容的字节数。
5、set-cookie:在客户端创建的cookie。
6、content-encodinig:指定服务器响应的内容的编码格式。
7、Cache-Control:用于开启缓存机制。
8、Expires:指定缓存过期时间。
9、Etag:指定服务器响应内容没有变化时不重新下载数据。
10、Access-Control-Allow-Origin: 设定允许跨域操作,值为允许想服务器请求数据的域名+端口号
//单独设置响应头,name: 响应字段名 value:响应字段对象的值(通过数组可以指定多个字段值)。
response.setHeader(name,value);
response.getHeader(name) //获取设置的响应头
response.removeHeader(name); //移除已设置的响应头信息
response.write(data,[encoding]):向请求客户端发送响应内容
——data是buffer或字符串,
——encoding为编码,默认字符串的编码格式为"utf8";
备注:
(1)当使用write方法发送数据时,如果之前没有调用writeHead方法,则Node.js会隐式调用该方法。
(2)response.write方法返回一个布尔类型值:当Node.js直接将数据发送到操作系统的内核缓存区中时,返回true(网络较好的情况时,服务器和客户端收发数据比较流畅),当先把数据缓存到Node.js设置的缓存区中时返回false(适用于服务器和客户端的收发速度不一致的情况,一般指客户端接收数据跟不上服务器的发送速度。这样Node.js先把数据缓存起来,等客户端接收完之前缓存在操作系统内核缓存区的数据时,再将数据发送到操作系统内核缓存区。)
response.end([data],[encoding]):响应结束,告知用户所有发送已经完成,当所有要返回的内容发送完毕,该函数必须被调用一次,如果不调用,客户端永远处于等待的状态
备注:
res.setHeader('Content-Type', 'text/html;charset=utf-8') //可以防止中英文乱码
response.setTimeout(msec,[callback]); //设置响应超时
response.on("timeout",function(){ //超时处理代码 }); //服务器响应超时时间
response.on("close",function(){ //连接中断处理事件});//在执行end之前端口连接,触发该事件;
Response.Flush() 将缓存中的内容立即显示出来,然后再执行后面的语句
reaponse.write(). //向客户端返回数据,可以多次调用,必须调用end()结束服务
response.end() //结束请求,也可以向客户端响应一些内容。参数只限定字符串和Buffer
response.send()。// 参数可以是Buffer对象,String,对象或Array,传入number是没反应的。 在服务器里面直接使用会报错
4. http.ClientRequest
使用http的request方法可以向其他服务器发送请求,类是于axios;
http.request():发送http请求道服务器,创建http.ClientRequest类的实例
http.get():类似于http.request(),但会自动地设置 HTTP 方法为 GET,并自动地调用 req.end()。
(4)socket:服务器端监听客户端请求的socket对象
const req = http.request(options,callback);
options:对象或者字符串,如果为字符串的话,表示要请求的URL地址。如果为对象的话,对象的属性包括以下信息:
host:要请求的域名或主机IP地址。
hostname:同host,优先级高于host(同时存在host和hostname会优先使用hostname)。
port:目标服务器的端口号。
localAddress:用于网络连接的本地接口。
socketPath: 指定目标Unix域端口。
method:请求方式。
path:请求路径及查询字符串,默认为/
header:请求时发送的庆丘头对象。
auth: 认证信息部分。
callback:获取目标网站所返回的响应流时调用的回调函数,原型为:
使用get方式向服务器发送数据
get方式和request方式区别为:request请求方式需要指定请求方式为get方式,并且数据发送结束后需要调用end方式终止响应,get方式结束数据发送时不需要调用end方法,Node.js默认调用。函数原型为:
5. Agent类:连接管理,获取连接数据
http.globalAgent:指向Agent对象的全局实例,用来管理http客户端连接的持久性和复用性;
网友评论