前言
看node.js的模块中方法是比较头疼,所以我们要学会如何寻找方法之间联系,学会http模块的大体流程就足够了。总的一句话就是识大体,细枝末节可以先不考虑
http模块用于客户端和服务端之间,也就是说写的代码也在这两端之间
http服务器
http请求被拆分成请求和响应被添加到处理程序中
function(req,res){}
这个形式的回调函数在http方法中使用很常见。同时后面也要研究request和response这两个对象。
创建一个http服务器
var server=http.createServer()
var server=new http.Server()
两种方式都是可以创建服务器。一个请求到达服务器,他是有生命周期的,在不同的阶段(事件),http插入了不同的钩子(函数)。
第一个是server上面的事件
- request事件,客户端请求达到是触发
- connect事件,tcp连接建立时触发
- close事件,服务器关闭触发,这里不是用户连接断开连接
我们常用的就是request事件
事件的基本形式server.on('xx',function(arguments){})
var server=http.createServer(function(req,res){
res.end('完成')
})
上面这个函数实际上是实现了两个功能,他将http服务器的创建和require事件触发相结合在一起了
request请求对象
请求分为请求体和请求头两部分组成
这是request能够读取到属性
请求体也是一个有生命的事物,他也有自己的事件
- data,请求体的内容就是通过这个事件传递,不过他不是传输请求体整块的内容,而是以chunk块形式传递。如果想要获取一个完整的内容需要使用字符串的拼接
res.on('data',function(chunk){})
- end,请求体数据传输完成会触发
- close,用户请求结束触发,用户强制取消也会触发
如果你使用过express这类框架,你会发现这个http服务器没办法对不同url和请求方法(get,post之类)做独立的处理
所要处理我们得手动定义逻辑,get方法在url中设置请求参数,我们要提取出来,post请求在请求体中设置数据,我们也需要通过事件提取出来。
我们手动去处理在大规模情况下,安全和效率都得不到保证,所有不推荐使用
response对象
他又三个方法
- res.writeHead(状态码,{请求头对象}),这里还有一个setHead方法,但是我觉得上面那个就够用了,同时两者同时书写,writeHead会覆盖setHead
- res.write(String|Buffer) 用于设置请求体
- res.end(数据,编码方式)代表响应体的结束数据丢入到请求体中,如果不使用这个方法,客户端就会一直处于等待状态
http客户端
发送请求的方式:
http.request(option)
http.get(option)
两者返回值都是一个 http.ClientRequest 实例(假设是req)
- option相当于设置一些请求头相关的信息
- host :请求网站的域名或 IP 地址。
- port :请求网站的端口,默认 80。
- method :请求方法,默认是 GET。
- path :请求的相对于根的路径,默认是“/”。QueryString 应该包含在其中。
- headers:设置请求头
后续可以使用一些方法去书写请求体
req.write()
req.end()
必须使用end代表本次请求报文编辑结束了,如果不调用服务器会收集不到
还有一些方法用于控制请求报文的发送(req.abort
终止请求报文的发送)和请求超时(req.setTimeout(number,callback:funciton)
)
事件:
1.response事件,代表收到响应的事件,回调函数传递一个ClientResponse对象
2.data:事件收到响应的报文体内容,数据的传递也是chunk块
3.end:数据传输结束
4.close:连接结束事件