http模块是Nodejs的核心模块,无需安装就可以直接使用。中文文档地址为:http://nodejs.cn/api/http.html
1.基本使用
首先在项目目录创建一个新文件server.js
,在里面编写如下内容:
// 引入核心模块
const http = require('http');
// 创建服务器
const sev = http.createServer();
// 为服务器绑定request事件 表示当用户的请求发送到的时候触发
// 回调函数的参数说明:
// 参数1:发起请求的客户端的信息
// 参数2:服务端处理响应的相关参数和方法
sev.on('request', function (request, response) {
console.log(request);
console.log(response);
// 设置响应编码,防止乱码的出现
response.setHeader('Content-Type', 'text/html;charset=utf-8');
// 结束响应
response.end('你好啊!');
});
// 设置服务器监听的端口
sev.listen('80', '127.0.0.1', function(){
});
然后在命令行中运行:
node ./server.js
如果没有报错,说明我们编写的没啥问题,这时候我们就可以在浏览器中访问:http://127.0.0.1:80
来查看效果了。
1. http.Server 类的介绍
我们前面使用代码const s = http.createServer();
得到的返回值就是一个http.Server
类,下面介绍一下该类的一些常用的属性和方法。
http.server
是一个基于事件的HTTP服务器,所有的请求都被封装到独立的事件当中,我们只需要对他的事件编写相应的行数就可以实现HTTP服务器的所有功能
1.1 常见事件
request
事件
当客户端请求到来的时候,该事件被触发,提供两个参数request
和response
,分别是http.IncomingMessage
和http.ServerResponse
的实例,分别表示请求和响应的信息。connection
事件
当TCP建立连接的时候,该事件被触发,提供了一个参数socket,为net.socket的实例(底层协议对象)close
事件
当服务器关闭的时候会被触发
当然他还有很多其它事件,其中最常用的就是request
事件,比如我们前面写的:
const s = http.createServer();
s.on('request', function (request, response) {
});
http.Server
中文文档:http://nodejs.cn/api/http.html#http_class_http_server
2. http.IncomingMessage类的介绍
http.IncomingMessage
的实例记录的是HTTP请求的信息,也就是客户端以及客户端发送到服务端的一些信息,服务端一般从这里获取前端发送来的数据。
2.1 常见属性
名称 | 含义 |
---|---|
complete | 客户端请求是否已经发送完成 |
httpVersion(常用) | HTTP协议版本,通常是1.0或1.1 |
method(常用) | HTTP请求方法,如:GET,POST |
url(常用) | 原始的请求路径 |
headers(常用) | HTTP请求头 |
connection | 当前HTTP连接套接字,为net.Socket的实例 |
socket | connection属性的别名 |
client | client属性的别名 |
console.log(request.url);
console.log(request.headers);
console.log(request.method);
console.log(request.httpVersion);
3. http.ServerResponse 类
http.ServerResponse
的实例是用来从服务端向客户端响应数据的。
3.1 常见属性和方法
-
write(chunk[, encoding][, callback])
发送请求主体的一个数据块,可以多次调用该方法以提供连续的响应主体片段response.write('我好帅啊!哈哈哈'); response.write('我真滴帅!哈哈哈');
-
end([data[, encoding]][, callback])
此方法向服务器发出信号,表明已发送所有响应头和主体,该服务器应该视为此消息已完成。 必须在每个响应上调用此response.end()
方法。本方法也可以直接发送二进制数据。 -
setHeader(name, value)
设置一项header信息,如果该响应头已存在,则值会被覆盖。 如果要发送多个名称相同的响应头,则使用字符串数组。 -
**
statusCode
**属性
设置响应状态码。response.statusCode = 404;
-
writeHead(statusCode[, statusMessage][, headers])
设置响应头信息,一般在较靠前的位置调用,
response.setHeader()
设置的响应头会与response.writeHead()
设置的响应头合并,且response.writeHead()
的优先 中文文档地址
中文文档地址:http://nodejs.cn/api/http.html#http_class_http_serverresponse
4. 编写一个静态页处理服务器
// 引入核心模块
const http = require('http');
const fs = require('fs');
const path = require('path');
// 创建服务器
const sev = http.createServer();
sev.on('request', function (request, response) {
// 获取用户要请求的文件路径
let filePath = __dirname+request.url;
let ext = path.extname(filePath);
// 处理文件的响应数据类型
if(ext == '.html'){
response.setHeader('Content-Type', 'text/html;charset=utf-8');
}else if(ext == '.css'){
response.setHeader('Content-Type', 'text/css;charset=utf-8');
}
// 读取文件
fs.readFile(filePath, function (err, data) {
if (!err) {
// 结束响应并将数据响应给客服端
response.end(data);
}else{
response.end('您访问的文件不存在');
}
})
});
// 设置服务器监听的端口
sev.listen('80', '127.0.0.1', function () {
console.log('服务器已启动');
});
5. 使用http模块处理post请求
//首先引入各个模块
const http = require('http');
//文件操作模块
const fs = require('fs');
//
const path = require('path');
//
const url = require('url');
// 创建服务器
const sev = http.createServer();
sev.on('request', function (request, response) {
let filePath = __dirname + request.url;
if (request.method == 'POST') {
var us = url.parse(request.url);
if(us.path = '/123'){
// 当请求的数据到达的时候,在这里接收数据
request.on('data', function(chunk){
console.log(chunk.toString());
// 上传文件的话,可以根据request.headers['content-type']的值进行判断来决定后续如何处理
})
}
response.end();
} else {
// 处理post以外的请求
let ext = path.extname(filePath);
if (ext == '.html') {
response.setHeader('Content-Type', 'text/html;charset=utf-8');
} else if (ext == '.css') {
response.setHeader('Content-Type', 'text/css;charset=utf-8');
}
// 读取文件
fs.readFile(filePath, function (err, data) {
if (!err) {
// 结束响应并将数据响应给客服端
response.end(data);
} else {
response.setHeader('Content-Type', 'text/html;charset=utf-8');
response.end('您访问的文件不存在');
}
})
}
});
// 设置服务器监听的端口
sev.listen('80', '127.0.0.1', function () {
console.log("您的服务器已启动");
});