客户端、服务端对我们都不陌生,Node.js 中的 HTTP 接口被设计成支持协议的许多特性。 比如,大块编码的消息。 这些接口不缓冲完整的请求或响应,用户能够以流的形式处理数据。

为了支持各种可能的 HTTP 应用,Node.js 的 HTTP API 是非常底层的。 它只涉及流处理与消息解析。 它把一个消息解析成消息头和消息主体,但不解析具体的消息头或消息主体。

1、API结构图

1.1 模块类结构图

Node 核心模块HTTP模块

1.2 Agent类结构图

Node 核心模块HTTP模块

1.3 ClientRequest类结构图

Node 核心模块HTTP模块

1.4 Server 类结构

Node 核心模块HTTP模块

1.5 ServerResponse类结构图

Node 核心模块HTTP模块

1.6 IncomingMessage类结构图

Node 核心模块HTTP模块

1.7 静态方法和属性图

Node 核心模块HTTP模块

2、实现常用http服务案例

开启http服务

// 1. 导入http模块
var http = require('http');

// 2. 使用http这个模块中的createServer()创建一个服务器实例对象
var server = http.createServer();

// 3. 绑定端口号,启动web服务器
server.listen(8000, function() {
    console.log(' 请访问http://localhost:8000');
});

// 4. 为这个服务器实例对象注册 request 请求处理函数
// 请求处理函数function(形参1,形参2){}
// 形参1:request请求对象 获取到当前请求的路径,方法等本次请求的所有信息
// 形参2:response响应对象 发送响应数据
server.on('request', function(request, response) {
    console.log('服务端收到客户端的请求啦!!!');
    // 向客户端页面返回字符串
    response.write("hello node");
    // 结束响应
    response.end();
});

运行结果

Node 核心模块HTTP模块

客户端请求两次的问题

用浏览器访问你会发现,node启动的服务会被请求两次,这是怎么回事呢?

Node 核心模块HTTP模块

打印下请求的url

Node 核心模块HTTP模块

原来是请求了favicon.ico(浏览器默认会请求一次favicon.ico),那就做下过滤吧

// 1. 导入http模块
var http = require('http');

// 2. 使用http这个模块中的createServer()创建一个服务器实例对象
var server = http.createServer();

// 3. 绑定端口号,启动web服务器
server.listen(8000, function() {
    console.log(' 请访问http://localhost:8000');
});

// 4. 为这个服务器实例对象注册 request 请求处理函数
// 请求处理函数function(形参1,形参2){}
// 形参1:request请求对象 获取到当前请求的路径,方法等本次请求的所有信息
// 形参2:response响应对象 发送响应数据
server.on('request', function(request, response) {
    //过滤请求favicon.ico
    if(request.url === '/favicon.ico'){
        return;
    }

    console.log('服务端收到客户端的请求啦!!!');
    //打印请求的url
    console.log(request.url);
    // 向客户端页面返回字符串
    response.write("hello node");
    // 结束响应
    response.end();
});

运行结果

Node 核心模块HTTP模块

已被过滤

响应中文乱码的问题

当我们想响应中文,你会发现中文是乱码的

Node 核心模块HTTP模块

这时候就需要设置响应头了,告诉浏览器我响应的是什么类型的数据

// 设置响应头
response.setHeader('Content-Type', 'text/html;charset=utf-8');

例:

// 1. 导入http模块
var http = require('http');

// 2. 使用http这个模块中的createServer()创建一个服务器实例对象
var server = http.createServer();

// 3. 绑定端口号,启动web服务器
server.listen(8000, function() {
    console.log(' 请访问http://localhost:8000');
});

// 4. 为这个服务器实例对象注册 request 请求处理函数
// 请求处理函数function(形参1,形参2){}
// 形参1:request请求对象 获取到当前请求的路径,方法等本次请求的所有信息
// 形参2:response响应对象 发送响应数据
server.on('request', function(request, response) {
    //过滤请求favicon.ico
    if(request.url === '/favicon.ico'){
        return;
    }

    console.log('服务端收到客户端的请求啦!!!');
    //打印请求的url
    console.log(request.url);


    // 设置响应头
    response.setHeader('Content-Type', 'text/html;charset=utf-8');

    // 向客户端页面返回字符串
    response.write("hello node");
    response.write("你好世界");
    // 结束响应
    response.end();
});

运行结果

Node 核心模块HTTP模块

响应整个html页面

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>测试Node 响应 html</title>
</head>
<body>
<h1>Node 响应整个html</h1>
</body>
</html>

httpServer.js

// 1. 导入http模块
var http = require('http');
var fs = require('fs');

// 2. 使用http这个模块中的createServer()创建一个服务器实例对象
var server = http.createServer();

// 3. 绑定端口号,启动web服务器
server.listen(8000, function() {
    console.log(' 请访问http://localhost:8000');
});

// 4. 为这个服务器实例对象注册 request 请求处理函数
// 请求处理函数function(形参1,形参2){}
// 形参1:request请求对象 获取到当前请求的路径,方法等本次请求的所有信息
// 形参2:response响应对象 发送响应数据
server.on('request', function(request, response) {
    //过滤请求favicon.ico
    if(request.url === '/favicon.ico'){
        return;
    }
    // 设置响应头
    response.setHeader('Content-Type', 'text/html;charset=utf-8');

    //读取index.html并响应
    fs.readFile('./index.html', 'utf-8', function (error, data) {
        // 结束响应
        response.end(data);
    });
});

运行结果

Node 核心模块HTTP模块

响应图片

如果响应http页面中有图片,你打印请求的链接你会发现,会向服务器再次请求图片,如

Node 核心模块HTTP模块

这时候我们可以根据请求链接判断,去处理是请求html页面还是图片,判断如果是图片的话就直接返回图片,如

// 判断请求图片
if (request.url.indexOf('jpg') >= 0) {
    fs.readFile('./img.jpg', function (error, data) {
        response.end(data);
    });
    return;
}

完整代码

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>测试Node 响应 html</title>
</head>
<body>
<h1>Node 响应整个html</h1>

<img src="img.jpg"/>

</body>
</html>

httpServer.js

// 1. 导入http模块
var http = require('http');
var fs = require('fs');

// 2. 使用http这个模块中的createServer()创建一个服务器实例对象
var server = http.createServer();

// 3. 绑定端口号,启动web服务器
server.listen(8000, function() {
    console.log(' 请访问http://localhost:8000');
});

// 4. 为这个服务器实例对象注册 request 请求处理函数
// 请求处理函数function(形参1,形参2){}
// 形参1:request请求对象 获取到当前请求的路径,方法等本次请求的所有信息
// 形参2:response响应对象 发送响应数据
server.on('request', function(request, response) {
    console.log(request.url, '请求链接');
    //过滤请求favicon.ico
    if(request.url === '/favicon.ico'){
        return;
    }

    // 判断请求图片
    if (request.url.indexOf('jpg') >= 0) {
        fs.readFile('./img.jpg', function (error, data) {
            response.end(data);
        });
        return;
    }

    // 设置响应头
    response.setHeader('Content-Type', 'text/html;charset=utf-8');

    //读取index.html并响应
    fs.readFile('./index.html', 'utf-8', function (error, data) {
        // 结束响应
        response.end(data);
    });

});

运行结果

Node 核心模块HTTP模块

响应一切静态资源

前面已经可以响应html页面和图片了,但是图片是根据url判断的,那如果要响应其他的静态资源呢,难道每个都做判断,这显然太麻烦了,不过你总结一下会发现其实我们要响应的就两种,一种是html页面还有一种是静态资源(图片,js,css),那就可以吧我们的代码稍微改下

// 1. 导入http模块
var http = require('http');
var fs = require('fs');

// 2. 使用http这个模块中的createServer()创建一个服务器实例对象
var server = http.createServer();

// 3. 绑定端口号,启动web服务器
server.listen(8000, function() {
    console.log(' 请访问http://localhost:8000');
});

// 4. 为这个服务器实例对象注册 request 请求处理函数
// 请求处理函数function(形参1,形参2){}
// 形参1:request请求对象 获取到当前请求的路径,方法等本次请求的所有信息
// 形参2:response响应对象 发送响应数据
server.on('request', function(request, response) {
    console.log(request.url, '----请求链接');
    //响应html页面
    if(request.url === '/'){
        // 设置响应头
        response.setHeader('Content-Type', 'text/html;charset=utf-8');
        //读取index.html并响应
        fs.readFile('./index.html', 'utf-8', function (error, data) {
            // 结束响应
            response.end(data);
        });
    }else{
        //响应其他静态资源
        fs.readFile('.'+request.url,function(error,data){
            response.end(data);
        })
    }

});

运行结果

Node 核心模块HTTP模块

相关文章:

  • 2021-05-29
  • 2021-10-31
  • 2021-08-22
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-09-21
猜你喜欢
  • 2021-05-27
  • 2022-12-23
  • 2021-06-05
  • 2021-07-05
  • 2021-09-26
  • 2021-07-01
  • 2022-12-23
相关资源
相似解决方案