美文网首页
nodejs入门总结四:http模块

nodejs入门总结四:http模块

作者: 牛妈代代 | 来源:发表于2022-04-16 20:07 被阅读0次

    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回调函数。

    1. 创建服务器

    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客户端连接的持久性和复用性;

    相关文章

      网友评论

          本文标题:nodejs入门总结四:http模块

          本文链接:https://www.haomeiwen.com/subject/mxzpsrtx.html