http模块

http 模块允许 Node.js 通过超文本传输协议(HTTP)传输数据,它使开发 Web 应用变得更加容易,要使用 http 模块,首先需要使用下面代码引入它:

var http = require('http');

http 模块中主要有 server 对象、response 对象和 request 对象,本节将对它们的使用进行讲解。

server对象

server 对象用来创建一个服务。在 Node.js 中,使用 http 模块中的 createServer() 方法,可以创建一个 server 对象,代码如下:

var server = require('http').createServer();

server 对象中主要使用的方法有 listen() 方法和 close() 方法,如表 11.3 所示,它们分别控制着服务器的启动和结束。

image 2024 04 16 15 27 23 460
Figure 1. 表11.3 server对象中的方法

端口(port)是计算机与计算机之间信息的通道。计算机中的端口从 0 开始,一共有 65535 个端口。

例如,首先创建一个 server 服务对象,并使用其 listen() 方法启动一个端口号为 52273 的本地地址,运行 10 秒后,使用 server 服务对象的 close() 方法关闭服务器。代码如下:

//创建server对象
var server = require('http').createServer();
//启动服务器,监听52273端口
server.listen(52273, function () {
     console.log('服务器监听地址是 http://127.0.0.1:52273');
});
//10秒后执行close()方法
var test = function () {
     //关闭服务器
     server.close();
};
setTimeout(test, 10000);

运行上面代码,初始效果如图11.6所示,等待10秒后,效果如图11.7所示。

image 2024 04 16 15 30 30 902
Figure 2. 图11.6 初始运行效果
image 2024 04 16 15 30 56 531
Figure 3. 图11.7 等待10秒后自动关闭服务器

response对象

response 对象用来输出响应内容,发送给客户端,该对象常用的方法如下。

  • writeHead(statusCode[,statusMessage][,headers]):返回响应头信息。参数说明如下。

    • statusCode:接收数字类型的状态码。

    • statusMessage:接收任何显示状态消息的字符串。

    • headers:接收任何函数、数组或字符串。

  • end([data][,encoding]):返回响应内容。参数说明如下。

    • data:执行完毕后要输出的字符。

    • encoding:对应 data 的字符编码。

例如,使用 http 模块的 createServer() 方法创建一个服务,在其中使用 response 对象中的 writeHead() 方法和 end() 方法获取服务器的响应内容,代码如下:

//创建Web服务器,并监听52273端口
require('http').createServer(function (request, response) {
     //返回响应内容
     response.writeHead(200, { 'Content-Type': 'text/html' });
     response.end('<h1>Hello,Node.js</h1>');
}).listen(52273, function () {
     console.log('服务器监听地址是 http://127.0.0.1:52273');
});

运行上面代码,然后在浏览器中输入 http://127.0.0.1:52273/,可以看到浏览器中的界面效果如图 11.8 所示。

image 2024 04 16 15 34 03 969
Figure 4. 图11.8 Web服务器输出响应信息

response 对象可以响应各种类型的内容,如 HTML 文件、多媒体文件等,下面分别进行介绍。

响应HTML文件

上面的示例中,我们直接在 end() 方法中编写响应内容 <h1>Hello,Node.js</h1> 并返回给客户端。但是实际开发中,不可能把所有内容都写在 end() 方法中,比如我们可以响应一个编写好的 HTML 文件,可以使用 fs 模块的 readFile() 方法读取其内容,然后通过 end() 方法去响应读取到的 HTML 文件内容并返回给客户端。

【例11.1】将 HTML 文件返回给客户端。(实例位置:资源包\源码\11\01)

步骤如下。

(1) 新建一个 index.html 文件,其中使用 <h1> 标签和 <pre> 标签输出一个 404 页面的字符画,该文件中的内容主要用作响应内容,代码如下:

<!DOCTYPE html>
<html>
<head>
     <!--指定页面编码格式-->
     <meta charset="UTF-8">
     <!--指定页头信息-->
     <title>特殊文字符号</title>
</head>
<body>
     <!--表示文章标题-->
     <h1 align="center">汪汪!你想找的页面让我吃喽!</h1>
     <!--绘制可爱小狗的字符画-->
     <pre align="center">
          .----.
          _.'__    `.
          .--($)($$)---/#\
          .' @          /###\
          :         ,   #####
          `-..__.-' _.-\###/
          `;_:    `"'
          .'"""""`.
          /,  hi ,\\
          //  你好!  \\
          `-._______.-'
          ___`. | .'___
          (______|______)
     </pre>
</body>
</html>

(2) 新建一个 .js 文件,该文件中使用 createServer() 方法创建一个 Web 服务器,然后使用 fs 模块的 readFile() 方法读取 index.html 的内容,存储到变量 data 中,最后通过 response 对象中的 end() 方法输出给客户端。代码如下:

//引入模块
var fs = require('fs');
var http = require('http');
//创建服务器
http.createServer(function (request, response) {
     //读取HTML文件内容
     fs.readFile('index.html', function (error, data) {
          response.writeHead(200, { 'Content-Type': 'text/html' });
          response.end(data);
     });
}).listen(52273, function () {
     console.log('服务器监听地址是 http://127.0.0.1:52273');
});

运行 .js 文件,在浏览器中输入 http://127.0.0.1:52273/ ,可以看到浏览器中的效果如图 11.9 所示。

image 2024 04 16 15 42 48 109
Figure 5. 图11.9 响应HTML文件

响应多媒体文件

【例11.2】将图片和视频返回客户端。(实例位置:资源包\源码\11\02)

本实例中需要准备的资源文件有 JavaScript.mp4demo.jpg 文件,然后在资源文件的目录下新建一个 js.js 文件,其中使用 createServer() 方法创建两个 Web 服务器,分别监听 52273 端口和 52274 端口。52273 端口的服务器用来输出图片,52274 端口的服务器用来输出视频。然后,使用 response 对象分别响应已经准备好的图片文件和视频文件,发送给客户端。js.js 文件如下:

//引入模块
var fs = require('fs');
var http = require('http');
//创建服务器,监听52273端口
http.createServer(function (request, response) {
     //读取图片文件
     fs.readFile('demo.jpg', function (error, data) {
          response.writeHead(200, { 'Content-Type': 'image/jpeg' });
          response.end(data);
     });
}).listen(52273, function () {
     console.log('服务器监听位置是 http://127.0.0.1:52273');
});
//创建服务器,监听52274端口
http.createServer(function (request, response) {
     //读取视频文件
     fs.readFile('JavaScript.mp4', function (error, data) {
          response.writeHead(200, { 'Content-Type': 'video/mpeg4' });
          response.end(data);
     });
}).listen(52274, function () {
     console.log('服务器监听位置是 http://127.0.0.1:52274');
});

运行 js.js 文件,在浏览器中输入 http://127.0.0.1:52273/ ,可以看到浏览器中的效果如图 11.10 所示。

image 2024 04 16 15 44 47 214
Figure 6. 图11.10 响应图片文件

在浏览器中输入 http://127.0.0.1:52274/ ,可以看到浏览器中的效果如图 11.11 所示。

网页自动跳转

在访问网站时,网页自动跳转是经常出现的情形之一,在 Node.js 中,实现该功能需要使用响应信息头的 Location 属性来指定要跳转的地址。

image 2024 04 16 15 46 38 679
Figure 7. 图11.11 响应视频文件

【例11.3】实现网页自动跳转。(实例位置:资源包\源码\11\03)

新建一个 js.js 文件,使用 createServer() 方法创建 Web 服务器后,在 writeHead() 方法中,使用 Location 属性指定要跳转的网页地址为 https://www.mingrisoft.com/ 。运行 js.js 文件,在浏览器中输入 http://127.0.0.1:52273/ ,可以看到浏览器中的效果如图 11.12 所示。

image 2024 04 16 15 47 40 148
Figure 8. 图11.12 自动跳转到其他网页

实例代码如下:

//引入模块
var http = require('http');
//创建服务器,实现网页自动跳转
http.createServer(function (request, response) {
     response.writeHead(302, { 'Location': 'https://www.mingrisoft.com/' });
     response.end();
}).listen(52273, function () {
     console.log('服务器监听地址在 http://127.0.0.1:52273');
});

上述代码中,writeHead() 方法的第一个参数(状态码)指定为 302,表示执行自动网页跳转。表 11.4 列出了常见的状态码及其含义。

image 2024 04 16 15 48 48 134
Figure 9. 表11.4 常见的状态码

request对象

request 对象表示 HTTP 请求,包含了请求查询字符串、参数、内容、HTTP 头等属性,其常用属性如表 11.5 所示。

image 2024 04 16 15 49 33 117
Figure 10. 表11.5 request 对象中的常见属性

HTTP 请求有两种,分别是 GET 请求和 POST 请求。其中,GET 请求用来获取数据,POST 请求用来提交数据。对于我们来说,分辨这两种请求的最直观的方法就是:GET 把参数包含在 URL 中,比如通过浏览器的地址栏直接输入访问某个网址,就是 GET 请求;POST 通过 request body 传递参数,比如输入用户名和密码登录某个网站,就是 POST 请求。

【例11.4】request 对象的使用。(实例位置:资源包\源码\11\04)

具体步骤如下。

(1) 创建一个 login.html 文件,该文件为一个基本的用户登录页面。代码如下:

<!DOCTYPE html>
<head>
     <meta charset="utf-8">
     <title>用户登录</title>
     <style>
          body {
               font: 13px/20px 'Lucida Grande', Tahoma, Verdana, sans-serif;
               color: #404040;
               background: #0ca3d2;
          }
          .container {
               margin: 80px auto;
               width: 640px;
          }
          /*篇幅原因,此处省略部分CSS代码*/
     </style>
</head>
<body>
<section class="container">
     <div class="login">
          <h1>用户登录</h1>
          <form method="post">
               <p><input type="text" name="login" value="" placeholder="用户名"></p>
               <p><input type="password" name="password" value="" placeholder="密码"></p>
               <p class="remember_me">
                     <label>
                          <input type="checkbox" name="remember_me" id="remember_me">
                          记住密码
                     </label>
               </p>
               <p class="submit"><input type="submit" name="commit" value="登录"></p>
          </form>
     </div>
</section>
</body>
</html>

(2)新建一个 js.js 文件,该文件中通过 request 对象的 method 属性对 GETPOST 请求进行判断。如果是 GET 请求,直接访问页面;如果是 POST 请求,则显示 POST 请求提交的数据。代码如下:

//引入模块
var http = require('http');
var fs = require('fs');
//创建服务器
http.createServer(function (request, response) {
     if (request.method == 'GET') {
          //GET请求
          fs.readFile('login.html', function (error, data) {
               response.writeHead(200, { 'Content-Type': 'text/html' });
               response.end(data);
          });
     } else if (request.method == 'POST') {
          //POST请求
          request.on('data', function (data) {
               response.writeHead(200, { 'Content-Type': 'text/html' });
               response.end('<h1>' + data + '</h1>');
          });
     }
}).listen(52273, function () {
     console.log('服务器监听地址是 http://127.0.0.1:52273');
});

运行 js.js 文件,在浏览器中输入 http://127.0.0.1:52273/ ,可以看到浏览器中的效果如图 11.13 所示。

image 2024 04 16 15 55 54 814
Figure 11. 图11.13 用户登录界面

在页面中输入用户名和密码,单击 “登录” 按钮,可以看到如图 11.14 所示的效果,这就是将通过 POST 请求提交的数据显示出来。

image 2024 04 16 15 58 00 396
Figure 12. 图11.14 显示POST请求提交的信息