zoukankan      html  css  js  c++  java
  • nodejs模块之http&&url

    我们使用nodejs中的http模块来进行网络操作

    一、什么是HTTP协议:

    超文本传输协议(HyperText Transfer Protocol)HTTP假定其下层协议提供可靠传输。

    因此,任何能够提供这种保证的协议都可以被其使用。因此也就是使用TCP作为其传输层。

    二、HTTP请求和响应报文的结构:

    HTTP请求的结构:
    请求行        GET /images/logo.gif HTTP/1.1   表示从/images目录下请求logo.gif这个文件
    ---------------------------------------------------------------------------------
    请求头        Accept-Language:en……
    ---------------------------------------------------------------------------------
    空行         区分请求头和请求主体
    ---------------------------------------------------------------------------------
    请求主体       请求中的内容

    HTTP响应的结构:
    响应行:    HTTP/1.1  200  OK
                   版本号 状态码 相应文本
    ---------------------------------------------------------------------------------
    响应头:    content-length:16……
    ---------------------------------------------------------------------------------
    空行      区分响应头和响应主体
    ---------------------------------------------------------------------------------
    响应主体    响应中的内容

    三、hTTP协议的特点:

    无状态、无连接、HTTP允许传输任意类型的数据对象

    简单来说就是无法像我们打电话那样你说一句,我说一句,可以持续通话,而HTTP协议只能做到你说一句,然后我说一句,只后想要通话只能再次建立连接。

    然后HTTP对传输数据的的类型不限制,可以是任意类型的。

    四、HTTP模块

    1、

    http.createServer([requestListener])    创建一个监听server,会返回一个http.Server对象,参数requestListener会作为request事件的回调函数,

                     该回调函数第一个参数为http.IncomingMessage实例,第二个参数为http.ServerResponse实例

    http.IncomingMessage                     一个对象,封装了客户端发送过来的请求

    http.ServerResponse                          响应对象

    2、http.Server对象的方法:

    on:给监听server添加事件处理函数

    listen:使用服务器监听端口

    http.Server支持的事件:

    request:有请求到来时触发回调函数

    close:服务器关闭时触发

    3、http.IncomingMessage对象的重要属性、事件和方法:

    属性:

    req.headers:请求头
    req.url:请求路径
    req.method:请求方法
    req.httpVersion:http协议的版本

    事件:

    data:接受到请求主体中的内容时会触发
    end:请求主体内容接受完毕时触发
    这两个配合获取请求主体全部内容

    "use strict";
    
    const http = require('http');
    
    const server = http.createServer(function (req, res) {
        // console.log(req.headers);
        // console.log(req.url);
        // console.log(req.method);
        // console.log(req.httpVersion);
    
        // 获取请求主体内容
        let body = '';
        req.on('data', function (thunk) {
            body += thunk; 
        });
        req.on('end', function () {
            console.log(body);
            res.setHeader('Content-Type', 'text/html');
            res.end('<h1>' + body + '</h1>');
        });
        
    });
    server.listen(3000);
    console.log('server is running in localhost:3000……');

    4、http.ServerResponse对象方法:

    res.end([data][,encoding][,callback])   用于声明整个请求已经发送完毕,同时也可以响应发送数据,每个响应必须调用一次,否则会导致请求持续连接不断的状态
    res.write(chunk[,encoding][,callback])    用于往请求主体汇总写入数据,并且调用了这个方法后,响应头以及响应行也不能再操作了(在end前分多次发送数据,必须在end前调用)
    res.statusCode <Number> 可操作响应状态码(eg:200,404)(状态码和浏览器显示内容没有关系,一般都是后端设定商量好的,可以是404,单页面显示正常)
    res.statusMessage <string> 可操作响应状态信息
    res.writeHead(statusCode[,statusMessage][,headers]) 设置请求头部,可以同时设置statusCode、statusMessage、headers,其中headers为一个对象

    "use strict";
    
    const http = require('http');
    
    const server = http.createServer(function (req, res) {
        // 设置响应状态码
        res.statusCode = 200;
        // 设置响应状态信息
        res.statusMessage = 'req success';
        // 设置响应头
        res.setHeader('Content-Type', 'text/html');
        // 响应数据,可分多次写入
        res.write('<h1>write01</h1>');
        res.write('<h1>write02</h1>');    
        // 响应
        res.end('<h1>end</h1>');
    });
    
    server.listen(3000);
    console.log('server is running in localhost:3000……');

    五、url模块

    url.parse(urlString[,parseQueryString[,slashesDenoteHost]])  将一个urlString进行解析

    第一个参数是url,第二个参数是一个boolean值,如果为true,则会将url中query解析为一个object返回,如果为false,则返回的query属性值则为一个未解析、未编码的string,默认为false

    "use strict";
    
    const http = require('http');
    const url = require('url');
    
    const server = http.createServer(function (req, res) {
        const urlObj = url.parse(req.url, true);
        console.log(urlObj); 
        res.end('<h1>parse urlString</h1>');
    });
    
    server.listen(3000);
    console.log('server is running in localhost:3000……');

    打印结果为:(标红属性是我们常用的)

    Url {
      protocol: null,
      slashes: null,
      auth: null,
      host: null,
      port: null,
      hostname: null,
      hash: null,
      search: '?name=lyl&age=18',
      query: { name: 'lyl', age: '18' },
      pathname: '/mypage/page01',
      path: '/mypage/page01?name=lyl&age=18',
      href: '/mypage/page01?name=lyl&age=18' 
    }

    使用如上这些知识,我们做很多东西:

    1、使用url.parse(req,url, true)来解析url,然后根据不同的url来做出不同的响应。

    2、我们可以根据不同的url进行路由选择,使用fs模块读取不同html模板文件,获取响应数据,然后对客户端做出响应,从而显示不同页面和数据。

    这是最简单的原理,但实现起来从优化、速度等方面总会产生很多问题,但总来来说原理都是这样。

    -------------------------------------------------------------------------------------------------------------------------end

  • 相关阅读:
    关于TCP/IP协议栈
    关于java socket
    批处理的高吞吐率和高延迟的解释
    关于Xmanager使用问题的总结
    关于Storm Stream grouping
    django url 传递多个参数
    多线程 python threading 信号量/递归锁
    多线程 python threading 简单锁/互斥锁
    django 1.9 wsgi + nginx
    django models ForeignKey Many-to-ManyField 操作
  • 原文地址:https://www.cnblogs.com/Walker-lyl/p/7251014.html
Copyright © 2011-2022 走看看