在介绍本节的内容前,先了解如下的概念:
什么是Http?
也即超文本传输协议(HTTP ,HyperText Transfer Protocol),是互联网上应用最为广泛的一种网络协议。所有的文件都必须遵守这个标准。设计最初的目的是为了提供一种发布和接收页面的方法,简单的说就是一种协议,它定义了通讯的客户端与服务器端如何传输数据。
什么是Web服务器?
Web服务器一般指网站服务器,是指驻留于因特网上某种类型计算机的程序,Web服务器的基本功能就是提供Web信息浏览服务。它只需支持HTTP协议、HTML文档格式及URL,与客户端的网络浏览器配合。大多数 web 服务器都支持服务端的脚本语言(php、python、ruby)等,并通过脚本语言从数据库获取数据,将结果返回给客户端浏览器。
目前最主流的三个Web服务器是Apache、Nginx、IIS。
Web应用框架(图片来自百度):
Client - 客户端,一般指浏览器,浏览器可以通过 HTTP 协议向服务器请求数据。
Server - 服务端,一般指 Web 服务器,可以接收客户端请求,并向客户端发送响应数据。
Business - 业务层, 通过 Web 服务器处理应用程序,如与数据库交互,逻辑运算,调用外部程序等。
Data - 数据层,一般由数据库组成。
以上的逻辑可以分为三层:用户界面层,业务逻辑层,数据访问层。也就是通常所讲的三层架构。
三层架构(3-tier architecture) 通常意义上的三层架构就是将整个业务应用划分为:界面层(User Interface layer)、业务逻辑层(Business Logic Layer)、数据访问层(Data access layer)。区分层次的目的即为了“高内聚低耦合”的思想。在软件体系架构设计中,分层式结构是最常见,也是最重要的一种结构。微软推荐的分层式结构一般分为三层,从下至上分别为:数据访问层、业务逻辑层(又或称为领域层)、表示层。
用户通过客户端界面(用户界面层),向服务器发出请求,服务器接收到请求以后,根据用户的请求进行业务逻辑处理(业务逻辑层),并向后台数据库请求数据(数据访问层)。最后将请求获取到的数据,呈现给前台用户。如下图(图片来自百度):
简单的Node.js Http
在之前的学习类容中,我们学习了如下的代码:
var http = require('http');
http.createServer(function (req, res) {
res.end('Hello World');
}).listen(3000, "10.17.255.73");
console.log('Server running at http://10.17.255.73:3000/');
1、从Node.js 的核心请求http模块并赋予一个变量,以后便以后在脚本中使用。
2、使用http.createServer方法撞见一个新的Web服务器对象,该对象的参数是一个匿名函数,函数的参数req代表请求,res代表回复的信息。
3、当请求到来时,应当相应"Hello World"字符串,然后关闭连接。
4、在最后定义了Web服务器的端口以及主机IP地址,这就意味着可以通过http://10.17.255.73:3000/ 这个地址来进行访问。
将上面的代码保存为Server.js 然后在网页中数据http://10.17.255.73:3000/,此时可以看到浏览器输出信息为"Hello World“。注意
这里的IP地址与端口,是在服务器端的IP地址与端口,实际运用中需要进行调整。
给服务器回复增加头信息
var http = require('http');
http.createServer(function (req, res) {
console.log(req)
<strong>res.writeHead(200, {
'Content-Type': 'text/plain'</strong>
});
res.end('Hello World');
}).listen(3000, "10.17.255.73");
console.log('Server running at http://10.17.255.73:3000/');
在上面的代码中,我们增加了一段头信息,这个信息,当服务器收到客户端的请求时,回复给客服端,内容是'text/plain',文本格式,这里的200是一个状态码,代表服务器端成功接收到消息。
这里我们可以看出,通过res.writeHead,可以回复给客户端一些信息,那么我们是否可以回复其他的内容呢?当然可以,比如我们需要进行页面重定向的时候,我们就可以这样修改代码:
var http = require('http');
http.createServer(function (req, res) {
<strong>res.writeHead(301, {
'': 'http://www.runoob.com/nodejs/nodejs-web-module.html'
});</strong>
res.end();
}).listen(3000, "10.17.255.73");
console.log('Server running at http://10.17.255.73:3000/');
服务器收到客户端的请求的以后,会回复客户端,让其通过301重定向到http://www.runoob.com/nodejs/nodejs-web-module.html 这个网站。
当然,我们可以通过截获客户端请求的内容,然后针对内容进行回复客户端信息,见如下的代码:
var http = require('http'),
url = require('url');
http.createServer(function (req, res) {
var pathname = url.parse(req.url).pathname;
if (pathname === '/') {
res.writeHead(200, {
'Content-Type': 'text/plain'
});
res.end('Home Page\n')
} else if (pathname === '/about') {
res.writeHead(200, {
'Content-Type': 'text/plain'
});
res.end('About Us\n')
} else if (pathname === '/redirect') {
res.writeHead(301, {
'Location': '/'
});
res.end();
} else {
res.writeHead(404, {
'Content-Type': 'text/plain'
});
res.end('Page not found\n')
}
}).listen(3000, "10.17.255.73");
console.log('Server running at http://10.17.255.73:3000/');
以上的内容,当服务器端收到客户端的请求,然后对请求的地址(req.url)进行解析获取pathname路径,如果是"/" ,则给客户端返回'Home Page\n',如果是'/about'
则返回'About Us\n'。以上的代码示例,我们可以在客户端输入http://10.17.255.73:3000/,或者http://10.17.255.73:3000/about 进行观察,客户端将从服务器端获取不同的请求数据。
以上是根据Node.js 关于Http 底层的简单应用,后续我们将会增加更多的应用场景。