Node中http模块详解(服务端篇)
2016-05-10 00:07
676 查看
Node中的Http
Node中提供了http模块,其中封装了高效的http服务器和http客户端http.server是一个基于事件的HTTP服务器,内部是由c++实现的,接口由JavaScript封装
http.request是一个HTTP客户端工具。用户向服务器发送数据。
下面就来分别得介绍一下http的服务端和客户端
一、HTTP服务器
http.Server实现的,它提供了一套封装级别很低的API,仅仅是流控制和简单的解析,所有的高层功能都需要通过它的接口,就像在前面的文章《Node入门必须知道的事情》中创建的服务器一样是特别的简单的。下面分别来讲一个有关http服务器的几个事件
1.http.server事件
http.server是一个基于事件的HTTP服务器,所有的请求都被封装到独立的事件当中,我们只需要对他的事件编写相应的行数就可以实现HTTP服务器的所有功能,它继承自EventEmitter,提供了以下的事件:
1. request:当客户端请求到来的时候,该事件被触发,提供两个参数
request和
response,分别是
http.ServerRequest和
http.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 | 客户端请求是否已经发送完成 |
httpVersion | HTTP协议版本,通常是1.0或1.1 |
method | HTTP请求方法,如:GET,POST |
url | 原始的请求路径 |
headers | HTTP请求头 |
trailers | HTTP请求尾(不常见) |
connection | 当前HTTP连接套接字,为net.Socket的实例 |
socket | connection属性的别名 |
client | client属性的别名 |
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]) 结束响应,告知用户所有发送已经完成,当所有要返回的内容发送完毕,
该函数必须被调用一次,如果不调用,客户端永远处于等待状态
相关文章推荐
- 网络直播产业揭秘:美女经济难持久 男性主播雄起
- 网络数据采集-读取文档
- iOS代码分享:分享、加密、解析、二维码、Http多线程、重力感应、常用界面重载等
- 基于HTTP的直播点播HLS
- windows 网络丢包测试
- 网络游戏服务器中事件和状态
- Python网络爬虫基础知识学习
- 用Fiddler模拟低速网络环境
- 传感器网络的应用层技术
- HttpSession笔记
- 96_网络框架Volley
- 网络
- 网络dos
- 为什么udp为什么不能发送大于1472字节数据
- 网络带宽和吞吐量throughput的关系
- 【Java8网络编程】第2章.Java中的URL和URI
- 关于网络编程
- The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path
- linux网络流量监控工具之iptraf
- Android Http请求头与响应头的学习