HTTP模块
用于:搭建 HTTP 服务端和客户端
步骤:
1、 调用 http 模块
var http = require('http');
2、 创建 http server
http.createServer([requestListener]);
requestListener 是一个请求函数,自动添加到 ‘request’ 事件。也就是我们以前所写的:
function(request, response){
//函数内容
}
函数传递有两个参数:request 请求对象 和 response 响应对象。
调用 request 请求对象的属性和方法就可以拿到所有 HTTP 请求的信息,
操作 response 响应对象的方法,就可以把 HTTP 响应返回给浏览器。
3、启动 web 服务
node server.js
response 对象常用的方法有:
1、 response.writeHead(statusCode[, statusMessage][, headers])
表示向请求发送响应头。
参数说明:
-
statusCode:状态码,是一个 3 位 HTTP 状态码,如 404 表示网页未找到,200 表示正常。
-
statusMessage: 可选,可以将用户可读的 statusMessage 作为第二个参数。
-
headers:响应头。
也就是设置 Content-Type 的值,用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件。
常用值有:
(1)text/html:HTML 格式
(2)text/plain:纯文本格式
(3)application/x-www-form-urlencoded:数据被编码为名称/值对,这是标准的编码格式。
比如:
response.writeHead(200, {'Content-Type': 'text/plain;charset=UTF-8' });
注:
此方法只能在消息上调用一次,并且必须在调用 response.end() 之前调用它。
2、response.write()
发送一块响应主体,也就是说用来给客户端发送响应数据。可以直接写文本信息,也可以写我们的 html 代码,注意要设置 Content-Type 的值 。write 可以使用多次,但是最后一定要使用 end 来结束响应,否则客户端会一直等待。
3、response.end()
此方法向服务器发出信号,表示已发送所有响应头和主体,该服务器应该视为此消息完成。必须在每个响应上调用方法 response.end()。
例子:
// 加载 http 模块
var http = require('http');
// 创建服务器
http.createServer(function (request, response) {
// 发送 HTTP 头部
// HTTP 状态值: 200 : OK
// 内容类型: text/html
response.writeHead(200, {'Content-Type': 'text/html;charset=UTF-8'});
// 发送响应数据 'hello'
response.write('hello');
// 发送数据 hello world 并且字体为 h1 格式
response.write('<h1>hello world</h1>');
// 结束
response.end();
// 上面的三行代码也可以直接写成 response.end('hello syl <h1>hello world</h1>');
}).listen(8080);
// 终端打印如下信息
console.log('Server running at http://127.0.0.1:8080/');
request 对象:
1、request.url
获取请求路径,获取到的是端口号之后的那一部分路径,也就是说所有的 url 都是以 / 开头的,判断路径处理响应。
2、request.socket.localAddress
获取 ip 地址。
3、request.socket.remotePort
获取源端口。
比如:
var http = require('http')
// 1. 创建 Server
var server = http.createServer()
// 2. 监听 request 请求事件,设置请求处理函数
server.on('request', function (req, res) {
console.log('收到请求了,请求路径是:' + req.url)
console.log('请求我的客户端的地址是:', req.socket.remoteAddress, req.socket.remotePort)
var url = req.url
res.writeHead(200, {'Content-Type': 'text/html;charset=UTF-8'});
if (url === '/') {
res.end('<h1>Index page</h1>')
} else if (url === '/login') {
res.end('<h1>Login page</h1>')
} else {
res.end('404 Not Found.')
}
})
// 3. 绑定端口号,启动服务
server.listen(8080, function () {
console.log('服务器启动成功,可以访问了。。。')
})
应用: 创建一个简单的网站
新建两个 html 文件,分别叫 index.html 和 register.html 。
新建一个 server.js 写我们的服务器代码。
// 结合 fs 发送文件中的数据
// 引入 http 和 fs 模块
var http = require('http');
var fs = require('fs');
// 创建服务器
var server = http.createServer();
// 监听 request 请求事件,设置请求处理函数
server.on('request', function(req, res) {
// 处理 url
var url = req.url;
if(url === '/') {
// 下面注释代码的写法显然是不合理的
// res.end('<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Document</title></head><body><h1>首页</h1></body>/html>')
res.setHeader('Content-Type', 'text/plain');
// 我们要发送的还是在文件中的内容
fs.readFile('./index.html', function(err, data) {
if(err) {
res.end('文件读取失败,请稍后重试!');
} else {
// data 默认是二进制数据,可以通过 .toString 转为咱们能识别的字符串
// res.end() 支持两种数据类型,一种是二进制,一种是字符串
res.writeHead(200, {
'Content-Type': 'text/html'
});
res.end(data);
}
})
} else if(url === '/register') {
// url:统一资源定位符
// 一个 url 最终其实是要对应到一个资源的
fs.readFile('./register.html', function(err, data) {
if(err) {
res.end('文件读取失败,请稍后重试!');
} else {
//setHeader也是设置响应头,它们将与传递给 response.writeHead() 的任何响应头合并,其中 response.writeHead() 的响应头优先。
res.setHeader('Content-Type', 'text/html');
res.end(data);
}
})
} else {
res.end('<h1>404 Not Found.</h1>');
}
});
server.listen(8080, function() {
console.log('Server is running...');
});
我们可以通过更改请求路径来响应出不同的 html 页面。