Node.js之http模块详解之客户端

在之前的篇章中,我们了解了http模块中的Server类和ServerResponse类。现在我们去了解一下http模块中的ClientRequest类与IncomingMessage类

http.ClientRequest类

http模块提供了 http.request()http.get() 两个方法,功能是作为客户端向http服务器发起请求。而ClientRequest类就是http.request()http.get() 两个方法方法是被创建的。ClientRequest类包含的事件和属性:

  1. abort事件:当请求被客户端中止时触发
  2. continue事件:当服务器发送 100 Continue HTTP 响应时触发,通常是因为请求包含 Expect: 100-continue。 这是客户端应发送请求主体的指令。
  3. response事件:当收到此请求的响应时触发。 此事件仅触发一次。
  4. aborted:用于判断请求是否已经中止,如果中止则为true
  5. request.end([data[, encoding]][, callback]):表明请求已经发送完毕。如果部分请求主体还未发送,则将它们刷新到流中
  6. request.write(chunk[, encoding][, callback]):发送一个请求主体的数据块。 通过多次调用此方法,可以将请求主体发送到服务器。
  7. request.setHeader(name, value)、request.removeHeader(name)、request.getHeader(name)、request.flushHeaders()等方法

了解完ClientRequest类,那我们去了解一下http.request。
具体语法格式:http.request(options[, callback])http.request(url[, options][, callback])。如果同时指定了 url 和 options,则对象会被合并,其中 options 属性优先, options 表示的是请求头

 const http=require('http');
    options= {
        host: 'localhost',
        port: '3000',
        method: 'GET',
        path: '/aicanxxx',
        headers: {
            "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
            'Accept-Encoding': 'gzip, deflate, sdch',
            'Accept-Language': 'en,zh-CN;q=0.8,zh;q=0.6',
            'Cache-Control': 'max-age=0',
            'Connection': 'keep-alive',
            'Host': 'www.cnblogs.com',
            'If-Modified-Since': 'Sat, 24 Jun 2017 04:38:48 GMT',
            'Upgrade-Insecure-Requests': '1',
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
        }
    };
    var req=http.request(options,function (res) {
        console.log(res.statusCode);
        console.log(JSON.stringify(res.headers));
        res.on('data',function (chunk,'utf8') {
            console.log(chunk);
        });
        res.on('end',function () {
            console.log('响应已结束');
        });
    });
    req.on('error',function (err) {
        console.log(err.message);
    });

    req.write('');//往请求体写入数据
    req.end();//完成请求并发送

http.request()方法给服务器端发送请求,第二个参数是调用http.request()时给response事件添加的一个监听器,当客户端接收到响应信息后调用该监听器, 使用 http.request() 时,必须始终调用 req.end() 来表示请求的结束,即使没有数据被写入请求主体。

客户端发送的请求req是一个可写流的子类http.ClientRequest类的实例,接收到的响应信息res是一个可读流的子类http.IncomingMessage类的实例。

http.IncomingMessage类

http.IncomingMessage类是被动创建的,是由http.Server类或http.ClientRequest类创建的。并分别作为第一个参数传递给request事件和response事件的监听器。它可用于访问响应状态、消息头、以及数据。具体的事件和属性:

  1. aborted事件:当请求中止时触发。
  2. close事件:表明底层连接已关闭。
  3. aborted:如果请求已中止,则属性值为 true。
  4. headers:请求或响应的消息头对象。
  5. method:仅对从 http.Server 获取的请求有效。获取请求方式
  6. statusCode:仅对从 http.ClientRequest 获取的响应有效。获取三位数状态码
  7. statusMessage:仅对从 http.ClientRequest 获取的响应有效。HTTP 响应状态消息
  8. url:仅对从 http.Server 获取的请求有效。获取 HTTP 请求中存在的 URL

请求信息和响应信息

在客户端和服务器端中都存在请求信息和响应信息,但客户端中的请求信息req_client和服务器端中的请求信息req_server是不相同的。req_client是由http.ClientRequest类产生的,然后再传递到服务器端的过程中转化为了http.IncomingMessage类,也就是说req_server接收到的是http.IncomingMessage类的实例

那么同理客户端中的响应信息res_client和服务器端中的请求信息res_server也不相同。res_serve是通过http.ServerResponse类产生,然后再转化为http.IncomingMessage类

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值