http
nodejs提供给了我们http模块,http有两个作用
1、搭建服务端,express就是基于http.createServer
2、做客户端,向其他服务端请求
Agent模块
http协议是通过,浏览器发送请求,服务端 响应请求这种方式交互,每次交互都需要进行,建立-传输-销毁的过程,http提供了持久连接即已经通过的连接可以重复使用,在客户端这个操作是浏览器完成的,但是在服务端需要我们自己来完成,所以有了agent 我们必须使用agent类来创建一个实例化,进行配置之后再去设置我们的请求的的agent
const http=require('http'); const agent=new http.Agent({ keepAlive:true, //开启长连接,因为每一次请求服务器,都要创建一次连接,完成后关闭,所以开启keep-live后会使得连接持续有效 maxSockets:10, //最大的套接字(socket)数量 keepAliveMsecs:1000, //指定Tcp的初始延迟时间 maxTotalSockets:10, //主机允许的最大套接字(socket数量) maxFreeSockets:156,//主机在空闲状态下保持打开的最大套接字(socket)数量 timeout:2000,//创建socket设置超时 }) http.get({ hostname: 'localhost', port: 80,//端口号 path: '/', agent: agent // 仅为这个请求创建新代理 },res=>{ res.on('data',data=>{ console.log(data.toString(),'data') }) })
上边的Agent的配置信息一直在提到套接字(socket)所以我们来看一下socket是什么
什么是socket?
socket的中文是 "插座" ,在计算机通信领域socket被译为套接字,它是计算机之间进行通信的一种或者一种方式,通过socket这种方式一台计算机可以接收数据,也可以发送数据。 socket最典型的例子就在身边,就是web服务器和浏览器,浏览器获取用户输入的url,服务器分析接收到的url将对应的html返回给浏览器。 浏览器在服务器发起请求时会有socket,然后服务器接收请求时也会有socket,socket一定是成对出现的
agent的方法
agent.createConnection
创建一个可用于http请求的socket,返回一个socket或者是可读可写的双工流
const a=agent.createConnection({ //创建一个可以用于http请求的socket //返回一个可读可写的双工流 //path 或者 port},(err,stream)=>{ console.log(e,'e'); console.log(s,'s') a.write('11')})a.on('data',e=>{ console.log(e.toString())})
agent.getName
获取当前使用agent的请求的名称
agent.getName({host:'127.0.0.1',port:'80'})
agent.sockets
返回当前代理的socket的数组
console.log(agent.sockets)
ClientRequest类
clientRequest类是由http.request返回给我们的,用于管理已经被放入请求队列中的请求,http.request是供给我们向服务端发起请求的,http.request创建请求后会返回给我们ClientRequest类,在请求创建时并不会发起,我们可以通过setHeader,getHeader,removeHead来对请求头进行操作,在request.end()之后请求才会发起
实例演示
const Http=require('http'); const ClientRequest=Http.request({ protoclo:'http:', //请求的协议 host:'localhost', // 地址//域名 port:'80', //端口号 method:'GET', //请求方式 agent, path:'/' ,//请求路径' timeout:1000 //超时时间 },res=>{ //请求受到 响应之后的回调 //res就是 http.IncomingMessage的实例这个在后边写 res.on('data',data=>{ //data就是返回过来的数据 }) }) //http.request只是创建请求,创建完请求后就会返回ClientRequest //我们调用ClientRequest.end才会发起请求 ClientRequest.end();
ClientRequest的方法
getHeader,setHeader,removeHead (获取,修改,删除请求头)
我们可以在发起请求之前去进行获取,修改和删除请求头
const Http=require('http'); const ClientRequest=Http.request({ protoclo:'http:', host:'localhost', port:'80', method:'GET', agent, path:'/' , timeout:1000},res=>{res.on('data',data=>{} }) //在发起请求前去获取,修改,删除,。请求头 console.log(ClientRequest.getHeader('host')); //getHeader方法接收一个参数,请求头的名称,返回值是请求头的值 ClientRequest.setHeader('cookie','{c:"11"}') //setHeader 方法接收两个参数,第一个是要设置的请求头的名称,第二个是请求头的值 ClientRequest.removeHead('cookie'); //removeHead 方法接收一个参数 , 要删除的请求头的名称 ClientRequest.end();
destory
destory方法用于关闭请求
创建一个可用于http请求的socket,返回一个socket或者是可读可写的双工流0
destoryed
destoryed是ClinetRequest的属性,它的值分为以下两种情况
创建一个可用于http请求的socket,返回一个socket或者是可读可写的双工流1
close
close事件,当请求被关闭时会被触发
创建一个可用于http请求的socket,返回一个socket或者是可读可写的双工流2
connect
connect事件是只有当请求是connect请求时才会被触发
创建一个可用于http请求的socket,返回一个socket或者是可读可写的双工流3
continue
continue事件,只有请求头带有 'Expect:100-continue' 才会被触发
创建一个可用于http请求的socket,返回一个socket或者是可读可写的双工流4
finish
创建一个可用于http请求的socket,返回一个socket或者是可读可写的双工流5
创建一个可用于http请求的socket,返回一个socket或者是可读可写的双工流6
information
information事件是在请求发送1xx中间时触发
创建一个可用于http请求的socket,返回一个socket或者是可读可写的双工流7
socket
socket事件,在socket被分配到请求时触发
创建一个可用于http请求的socket,返回一个socket或者是可读可写的双工流8
Server类 (node做web服务器的重中之重)
server是用于我们使用node搭建服务器,express框架就是基于Server类的
实例演示
创建一个可用于http请求的socket,返回一个socket或者是可读可写的双工流9
Server的方法
checkContinue
当服务端的请求头有Expect:100-continue会触发此事件,而且不再触发request事件
const a=agent.createConnection({ //创建一个可以用于http请求的socket //返回一个可读可写的双工流 //path 或者 port},(err,stream)=>{ console.log(e,'e'); console.log(s,'s') a.write('11')})a.on('data',e=>{ console.log(e.toString())})0
checkExpectation
请求头中带有,Expect属性且值不是100-continue会触发此事件,且不再触发request事件
const a=agent.createConnection({ //创建一个可以用于http请求的socket //返回一个可读可写的双工流 //path 或者 port},(err,stream)=>{ console.log(e,'e'); console.log(s,'s') a.write('11')})a.on('data',e=>{ console.log(e.toString())})1
clientError
当客户端连接触发error事件时,会触发此事件
const a=agent.createConnection({ //创建一个可以用于http请求的socket //返回一个可读可写的双工流 //path 或者 port},(err,stream)=>{ console.log(e,'e'); console.log(s,'s') a.write('11')})a.on('data',e=>{ console.log(e.toString())})2
close
当调用Server.close()时触发
const a=agent.createConnection({ //创建一个可以用于http请求的socket //返回一个可读可写的双工流 //path 或者 port},(err,stream)=>{ console.log(e,'e'); console.log(s,'s') a.write('11')})a.on('data',e=>{ console.log(e.toString())})3
connect
接收connect请求
const a=agent.createConnection({ //创建一个可以用于http请求的socket //返回一个可读可写的双工流 //path 或者 port},(err,stream)=>{ console.log(e,'e'); console.log(s,'s') a.write('11')})a.on('data',e=>{ console.log(e.toString())})4
request
每次接收到请求时都会触发request事件
const a=agent.createConnection({ //创建一个可以用于http请求的socket //返回一个可读可写的双工流 //path 或者 port},(err,stream)=>{ console.log(e,'e'); console.log(s,'s') a.write('11')})a.on('data',e=>{ console.log(e.toString())})5
close
close方法用于关闭服务,调用此方法会触发close事件
const a=agent.createConnection({ //创建一个可以用于http请求的socket //返回一个可读可写的双工流 //path 或者 port},(err,stream)=>{ console.log(e,'e'); console.log(s,'s') a.write('11')})a.on('data',e=>{ console.log(e.toString())})6
listen
listen方法用于开启服务,
const a=agent.createConnection({ //创建一个可以用于http请求的socket //返回一个可读可写的双工流 //path 或者 port},(err,stream)=>{ console.log(e,'e'); console.log(s,'s') a.write('11')})a.on('data',e=>{ console.log(e.toString())})7
headersTimeout
headersTimeout方法用来限制,解析请求头的时间,如果超时则关闭连接
const a=agent.createConnection({ //创建一个可以用于http请求的socket //返回一个可读可写的双工流 //path 或者 port},(err,stream)=>{ console.log(e,'e'); console.log(s,'s') a.write('11')})a.on('data',e=>{ console.log(e.toString())})8
listening
listenting属性用来查看是否正在监听连接,即服务是否开启
const a=agent.createConnection({ //创建一个可以用于http请求的socket //返回一个可读可写的双工流 //path 或者 port},(err,stream)=>{ console.log(e,'e'); console.log(s,'s') a.write('11')})a.on('data',e=>{ console.log(e.toString())})9
ServerResponse类
ServerResponse就是request事件里的,res
agent.getName({host:'127.0.0.1',port:'80'})0
res的方法
SetHeader
agent.getName({host:'127.0.0.1',port:'80'})1
agent.getName({host:'127.0.0.1',port:'80'})2
getHeader
获取响应头
agent.getName({host:'127.0.0.1',port:'80'})3
hasHeader
查询响应后
agent.getName({host:'127.0.0.1',port:'80'})4
getHeadersNames
获取到所有响应头的名称
agent.getName({host:'127.0.0.1',port:'80'})5
getHeaders
获取到所有的响应头
agent.getName({host:'127.0.0.1',port:'80'})6
statusCode
设置 响应的状态码
agent.getName({host:'127.0.0.1',port:'80'})7
statusMeassage
设置响应的状态信息
agent.getName({host:'127.0.0.1',port:'80'})8
write
写入响应内容,并发送
agent.getName({host:'127.0.0.1',port:'80'})9
end
结束写入内容,可参考writeableStream的end方法
console.log(agent.sockets)0
finish
finish事件,在开始响应请求时触发
console.log(agent.sockets)1
close
close事件,请求响应完成时触发
console.log(agent.sockets)2
IncomingMessage类
IncomingMessage分别存在于http.server(做服务端)里和http.request(发起请求)里边,在server里是request,在request里是response,它是一个可读流,包含了请求头,和数据和响应状态
实例演示
console.log(agent.sockets)3
IncominMessage的方法
close
console.log(agent.sockets)4
console.log(agent.sockets)5
complete 属性
如果已经成功解析HTTP消息,则complete属性为true,否则为false 最好在服务关闭的时候进行判断
console.log(agent.sockets)6
destory
关闭服务 或者 关闭请求
console.log(agent.sockets)7
headers httpVersion
http版本httpAVersion 接收到的headers 在服务端是客户端发来请求的的headers和http版本 在客户端是服务端返回数据的headers和http版本
console.log(agent.sockets)8
method (仅使用于server)
仅仅在服务端使用,客户端请求的方式,get 或者Post等
console.log(agent.sockets)9
socket
获取互相连接的socket,可在服务端或者客户端获取
url
仅在服务端获取,得到客户端的url
clientRequest类是由http.request返回给我们的,用于管理已经被放入请求队列中的请求,http.request是供给我们向服务端发起请求的,http.request创建请求后会返回给我们ClientRequest类,在请求创建时并不会发起,我们可以通过setHeader,getHeader,removeHead来对请求头进行操作,在request.end()之后请求才会发起0
statucCode
仅仅在客户端获取,得到请求响应的状态码
clientRequest类是由http.request返回给我们的,用于管理已经被放入请求队列中的请求,http.request是供给我们向服务端发起请求的,http.request创建请求后会返回给我们ClientRequest类,在请求创建时并不会发起,我们可以通过setHeader,getHeader,removeHead来对请求头进行操作,在request.end()之后请求才会发起1
常见的http状态码
clientRequest类是由http.request返回给我们的,用于管理已经被放入请求队列中的请求,http.request是供给我们向服务端发起请求的,http.request创建请求后会返回给我们ClientRequest类,在请求创建时并不会发起,我们可以通过setHeader,getHeader,removeHead来对请求头进行操作,在request.end()之后请求才会发起2
http上的方法
METHODS
列出所有node支持的请求方法
clientRequest类是由http.request返回给我们的,用于管理已经被放入请求队列中的请求,http.request是供给我们向服务端发起请求的,http.request创建请求后会返回给我们ClientRequest类,在请求创建时并不会发起,我们可以通过setHeader,getHeader,removeHead来对请求头进行操作,在request.end()之后请求才会发起3
STATUS_CODES
返回一个对象,包含了所有http状态码,以及描述
clientRequest类是由http.request返回给我们的,用于管理已经被放入请求队列中的请求,http.request是供给我们向服务端发起请求的,http.request创建请求后会返回给我们ClientRequest类,在请求创建时并不会发起,我们可以通过setHeader,getHeader,removeHead来对请求头进行操作,在request.end()之后请求才会发起4
createServer
createServer方法,帮助我们快速搭建一个web服务器,它返回一个Server实例
clientRequest类是由http.request返回给我们的,用于管理已经被放入请求队列中的请求,http.request是供给我们向服务端发起请求的,http.request创建请求后会返回给我们ClientRequest类,在请求创建时并不会发起,我们可以通过setHeader,getHeader,removeHead来对请求头进行操作,在request.end()之后请求才会发起5
get
http.get方法,相当于http.request方法,主要用于请求,区别就是它的method固定于get
clientRequest类是由http.request返回给我们的,用于管理已经被放入请求队列中的请求,http.request是供给我们向服务端发起请求的,http.request创建请求后会返回给我们ClientRequest类,在请求创建时并不会发起,我们可以通过setHeader,getHeader,removeHead来对请求头进行操作,在request.end()之后请求才会发起6
maxHeaderSize
设置请求头大小(默认是16kb)
clientRequest类是由http.request返回给我们的,用于管理已经被放入请求队列中的请求,http.request是供给我们向服务端发起请求的,http.request创建请求后会返回给我们ClientRequest类,在请求创建时并不会发起,我们可以通过setHeader,getHeader,removeHead来对请求头进行操作,在request.end()之后请求才会发起7
globalAgent
设置全局的agent
clientRequest类是由http.request返回给我们的,用于管理已经被放入请求队列中的请求,http.request是供给我们向服务端发起请求的,http.request创建请求后会返回给我们ClientRequest类,在请求创建时并不会发起,我们可以通过setHeader,getHeader,removeHead来对请求头进行操作,在request.end()之后请求才会发起8
request
request方法用于发起请求,它返回ClientRequest实例
clientRequest类是由http.request返回给我们的,用于管理已经被放入请求队列中的请求,http.request是供给我们向服务端发起请求的,http.request创建请求后会返回给我们ClientRequest类,在请求创建时并不会发起,我们可以通过setHeader,getHeader,removeHead来对请求头进行操作,在request.end()之后请求才会发起9原文:https://juejin.cn/post/7096405468137914398