Node中的http模块详解(服务端)

Node中的Http

Node中提供了http模块,其中封装了高效的http服务器和http客户端 
http.server是一个基于事件的HTTP服务器,内部是由c++实现的,接口由JavaScript封装 
http.request是一个HTTP客户端工具。用户向服务器发送数据。 
下面就来分别得介绍一下http的服务端和客户端

一、HTTP服务器

http.Server实现的,它提供了一套封装级别很低的API,仅仅是流控制和简单的解析,所有的高层功能都需要通过它的接口。 
下面分别来讲一个有关http服务器的几个事件

1.http.server事件

http.server是一个基于事件的HTTP服务器,所有的请求都被封装到独立的事件当中,我们只需要对他的事件编写相应的行数就可以实现HTTP服务器的所有功能,它继承自EventEmitter,提供了以下的事件: 
1. request:当客户端请求到来的时候,该事件被触发,提供两个参数requestresponse,分别是http.ServerRequesthttp.ServerResponse表示请求和响应的信息。 
2. connection:当TCP建立连接的时候,该事件被触发,提供了一个参数socket,为net.socket的实例(底层协议对象) 
3. close:当服务器关闭的时候会被触发 
4. 除此之外还有checkContinue、upgrade、clientError等事件 
我们最常用的还是request事件,http也给这个事件提供了一个捷径:http.createServer([requestListener]) 
下面我们来简单的看一下两个案例: 
第一个是使用request事件的:

const http = require('http');
const net  = require('net');
const util = require('util');
//随便定义的一个函数,下面会用到
function  a(){
    console.log("dajiahao");
}
var server = new http.Server();
server.on('request',(req,res)=>{
    console.log(req.url);
    //设置应答头信息
    res.writeHead(200,{'Content-Type':'text/html'});
    res.write('hello we are family<br>');
    res.end('server already end\n');
});
//显示了三次这也证明了TCP的三次握手
server.on('connection',()=>{
    a();
});
server.on('close',()=>{
    console.log('server will close');
});
//关闭服务为了触发close事件
server.close();
server.listen(8080);

下面的案例使用http的给的捷径http.createServer制作的代码:

const http = require('http');
const net  = require('net');
const util = require('util');


http.createServer(function(req,res){
    res.writeHead(404,{'Content-Type':'text/plain'})
    res.write("we are is content");
    res.end("fdsa");

}).listen(3000);

2.http.ServerRequset请求信息

我们都知道HTTP请求分为两部分:请求头请求体,如果请求的内容少的话就直接在请求头协议完成之后立即读取,请求体可能相对较长一点,需要一定的时间传输。因此提供了三个事件用于控制请求体传输
(1)data:当请求体数据到来时,该事件被触发,该事件一共一个参数chunk,表示接受到的数据。 
(2)end:当请求体数据传输完成时,该事件被触发,此后将不会再有数据到来。 
(3)close:用户当前请求结束时,该事件被触发,不同于end,如果用户强制终止了传输,也会触发close 
ServerRequest的属性

名称含义
ccomplete客户端请求是否已经发送完成
httpVersionHTTP协议版本,通常是1.0或1.1
methodHTTP请求方法,如:GET,POST
url原始的请求路径
headersHTTP请求头
trailersHTTP请求尾(不常见)
connection当前HTTP连接套接字,为net.Socket的实例
socketconnection属性的别名
clientclient属性的别名
http.createServer(function(req,res){
    console.log(req.httpVersion);
    //console.log(req.socket);
    console.log(req.headers);
    console.log(req.method);
    res.writeHead(404,{'Content-Type':'text/plain'})
    res.write("we are is content");
    res.end("fdsa");
}).listen(8080);

3.获取GET请求内容

由于GET请求直接被嵌入在路径中,URL完整的请求路径,包括了?后面的部分,因此你可以手动解析后面的内容作为GET的参数,Nodejs的url模块中的parse函数提供了这个功能

const http = require('http');
const net  = require('net');
const url  = require('url');
const util = require('util');

http.createServer((req,res)=>{
    res.write(util.inspect(url.parse(req.url,true)));
    //利用url模块去解析客户端发送过来的URL
    res.end(util.inspect(url.parse(req.url,false)));
}).listen(8080);

4.获得POST请求内容

POST请求的内容全部都在请求体中,http.ServerRequest并没有一个属性内容为请求体,原因是等待请求体传输可能是一件耗时的工作。譬如上传文件。恶意的POST请求会大大消耗服务器的资源。所以Nodejs是不会解析请求体,当你需要的时候,需要手动来做。 
简单的看一下代码:

const http = require('http');
const net  = require('net');
const url  = require('url');
const util = require('util');
//querystring用于处理URL中的查询字符串
const querystring = require('querystring');

http.createServer((req,res)=>{
    var posr = '';
    req.on('data',(chunk)=>{
        post+=chunk;
    });
    res,on('end',()=>{
        //将字符串变为json的格式
        post  =  querystring.parse(post);
        //向前端返回字符串
        res.end(util.inspect(post));
    });
})

5.http.ServerResponse返回客户端信息

决定了用户最终能到的结果,它是由http.Server的request事件发送的,作为第二个参数传递。一般为response或res 
主要的三个函数: 
response.writeHead(statusCode,[headers]):向请求的客户端发送响应头。 
statusCode是HTTP的状态码,如200为成功,404未找到等。 
headers是一个类似关联数组的对象,表示响应头的每个属性。 
response.write(data,[encoding]) 向请求客户端发送相应内容,data是buffer或字符串,encoding为编码 
response.end([data],[encoding]) 结束响应,告知用户所有发送已经完成,当所有要返回的内容发送完毕,该函数必须被调用一次,如果不调用,客户端永远处于等待状态

转载于:https://my.oschina.net/u/3026577/blog/1636137

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值