node.js核心http模块的使用

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 常见事件

  1. request事件
    当客户端请求到来的时候,该事件被触发,提供两个参数requestresponse,分别是http.IncomingMessagehttp.ServerResponse的实例,分别表示请求和响应的信息。
  2. connection事件
    当TCP建立连接的时候,该事件被触发,提供了一个参数socket,为net.socket的实例(底层协议对象)
  3. 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 常见属性和方法

  1. write(chunk[, encoding][, callback])
    发送请求主体的一个数据块,可以多次调用该方法以提供连续的响应主体片段

    response.write('我好帅啊!哈哈哈');
    response.write('我真滴帅!哈哈哈');
    
  2. end([data[, encoding]][, callback])
    此方法向服务器发出信号,表明已发送所有响应头和主体,该服务器应该视为此消息已完成。 必须在每个响应上调用此 response.end() 方法。本方法也可以直接发送二进制数据。

  3. setHeader(name, value)
    设置一项header信息,如果该响应头已存在,则值会被覆盖。 如果要发送多个名称相同的响应头,则使用字符串数组。

  4. **statusCode**属性
    设置响应状态码。 response.statusCode = 404;

  5. 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("您的服务器已启动");
});
发布了22 篇原创文章 · 获赞 0 · 访问量 1157

猜你喜欢

转载自blog.csdn.net/bigpatten/article/details/103622668