http.server是一个基于事件(events)的HTTP服务器,所有的请求都被设置了触发器,我们只需要设置对应监听器就可以实现HTTP服务器的所有功能,以下内置的触发器:
- request:当客户端请求到来的时候,该事件被触发,提供两个参数request和response,分别是http.ServerRequest和http.ServerResponse表示请求和响应的信息。
- connection:当TCP建立连接的时候,该事件被触发,提供了一个参数socket,为net.socket的实例(底层协议对象)
- close:当服务器关闭的时候会被触发
- 除此之外还有checkContinue、upgrade、clientError等事件
我们最常用的还是request事件,http也给这个事件提供了一个捷径:http.createServer([requestListener])
以下使简单的使用
const http = require('http');
let 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', () => {
console.log('握手');
});
server.on('close', () => {
console.log('server will close');
});
//关闭服务为了触发close事件
server.close();
server.listen(8080);
// 或者用更为简便的方式
http.createServer(function(req,res){
res.writeHead(200,{'Content-Type':'text/plain'})
res.write("hi, from aicoder.com");
res.end();
}).listen(3000);
我们都知道HTTP请求分为两部分:请求头和请求体,如果请求的内容少的话就直接在请求头协议完成之后立即读取,请求体可能相对较长一点,需要一定的时间传输(比如传送了一个1G的压缩包)。
因此提供了三个触发器用于控制请求体传输.(req实例触发的啦)
-
data:当请求体数据到来时,该事件被触发,该事件一共一个参数chunk,表示接受到的数据。
-
end:当请求体数据传输完成时,该事件被触发,此后将不会再有数据到来。
-
close:用户当前请求结束时,该事件被触发,不同于end,如果用户强制终止了传输,也会触发close。
我们再看看req的一些属性:
| 名称 | 含义 |
|---|---|
| complete | 客户端请求是否已经发送完成 |
| 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();
}).listen(8080);
我们之前说过,可能post会上传一个很大的文件,我们需要去手动的处理他,node并不会帮助我们默认处理,防止导致恶意上传。
// 获取post请求数据
const http = require('http');
const util = require('util');
const querystring = require('querystring');
http.createServer((req, res) => {
let post = '';
req.on('data', chunk => {
post += chunk;
});
req.on('end', () => {
post = querystring.parse(post);
res.end(util.inspect(post));
});
})
.listen(3000);
以上教程均来自 https://www.cnblogs.com/fly_dragon/p/8836888.html FlyDragon老师,致敬。
有缘会再次分析官网的文档的一些api的表示内容。