zoukankan      html  css  js  c++  java
  • Node 核心模块HTTP模块

    Node 核心模块HTTP模块

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

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

    1、API结构图

    1.1 模块类结构图

    图片描述

    1.2 Agent类结构图

    图片描述

    1.3 ClientRequest类结构图

    图片描述

    1.4 Server 类结构

    图片描述

    1.5 ServerResponse类结构图

    图片描述

    1.6 IncomingMessage类结构图

    图片描述

    1.7 静态方法和属性图

    图片描述

    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();
    });
    

    运行结果

    image-20201003163512361

    客户端请求两次的问题

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

    image-20201003164531967

    打印下请求的url

    image-20201003164631121

    原来是请求了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();
    });
    

    运行结果

    image-20201003165101263

    已被过滤

    响应中文乱码的问题

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

    image-20201003165254944

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

    // 设置响应头
    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();
    });
    

    运行结果

    image-20201003165530609

    响应整个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);
        });
    });
    

    运行结果

    image-20201003171409202

    响应图片

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

    image-20201004141519026

    这时候我们可以根据请求链接判断,去处理是请求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);
        });
    
    });
    

    运行结果

    image-20201004142559893

    响应一切静态资源

    前面已经可以响应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);
            })
        }
    
    });
    

    运行结果

    image-20201004143914190

  • 相关阅读:
    java中的成员变量和局部变量
    多线程实现输出当前时间,和猜数字游戏
    JDBC
    jQuery和原生JS的对比
    JavaScript有趣的知识点
    MySQL的数据类型
    行级元素和块级元素
    重定向和请求转发的区别
    JSP九大内置对象
    Python练习
  • 原文地址:https://www.cnblogs.com/makalochen/p/13767424.html
Copyright © 2011-2022 走看看