• nodejs基础:浅聊url和querystring模块


    url 模块

    url是什么?简单的说url全球统一资源定位符,对网站资源的一种简洁表达形式,也称为网址。

    现在看一下url格式的三个部分:

    https://blog.csdn.net/u011863822?spm=1000.2115.3001.5343
    
    • 1
    • 第一部分是协议(或称为服务方式),一般网址是http或者https。 所以例子中协议是https。
    • 第二部分是存有该资源的主机IP地址(有时也包括端口号)。但是为了更好的记录所以就有域名,一般的情况下都是www开始的,比如百度 www.baidu.com ,但是也不是绝对自然有人不遵守万维网的规则,比如csdn中就是blog.csdn.net。
    • 第三部分是主机资源的具体地址,如目录和文件名等。这个就是再域名中查找自己请求资源的位置,就像是域名是D盘,而你的文件还有需要有一个更加详细的地址。

    还有可以在后面添加后面是参数,尤其是get请求中参数更有意义。

    而url模块就是帮忙处理url的一个模块,比如例子中的如何知道目录地址,以及域名可能处理的话需要用字符串分割等操作,但是url却可以帮忙我们更好的处理,现在看一下其常用的方法。

    过时常用的方法

    parse方法

    先体验一下:

    var url= require('url')
    const url_html='https://blog.csdn.net/u011863822?spm=1000.2115.3001.5343'
    console.log(url.parse(url_html))
    
    • 1
    • 2
    • 3

    看输出了什么:

    在这里插入图片描述

    可以看出将网址请求,所以可以看出请求的所有地址的信息,不用自己去用正则或者分割字符串了,这个模块。

    毕竟通过req.url 如果带有参数的话,就需要分割这个url字符串了,用这个之间通过pathname得到请求地址,岂不是很香。

    其实可以有两个参数:

    var url= require('url')
    const url_html='https://blog.csdn.net/u011863822?spm=1000.2115.3001.5343'
    console.log(url.parse(url_html,true))
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    可以看出query的参数变成了一个object,更加方便了。

    format()方法

    既然能变成一个urlObject,自然也可以通过urlObject转换为一个url。

    var url= require('url')
    const urlobjct= {
        protocol: 'https:',
        slashes: true,
        auth: null,
        host: 'blog.csdn.net',
        port: null,
        hash: null,
        search: '?spm=1000.2115.3001.5343',
        query: 'spm=1000.2115.3001.5343',
        pathname: '/u011863822',
        path: '/u011863822?spm=1000.2115.3001.5343',
        href: 'https://blog.csdn.net/u011863822?spm=1000.2115.3001.5343'
      }
      console.log(url.format(urlobjct))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在这里插入图片描述

    resolve方法

    格式:

    resolve(from, to)
    
    • 1
    • from 如果 to 是相对的 URL,则使用的基本的 URL。
    • to 要解析的目标 URL。

    url.resolve() 方法以类似于 Web 浏览器解析锚标记的方式解析相对于基本 URL 的目标 URL。

    还是老规矩演示,这个官网例子,直接用。

    const url = require('url');
    // 如果前面最后不是/ 后面也没有/ 就直接替换前面/后面的内容
    url.resolve('/one/two/three', 'four');         // '/one/two/four'
    
    // 如果前面最后是/ 后面也没有/ 就直接放在前面/后面
    url.resolve('/one/two/three/', 'four');   // '/one/two/three/four'
    
    // 如果后面有/ 就直接放在前面/后面域名后面
    url.resolve('http://example.com/', '/one');    // 'http://example.com/one'
    url.resolve('http://example.com/one', '/two'); // 'http://example.com/two'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    看一下官网发现其提示是过时了

    在这里插入图片描述

    上面三个方法其实旧版的写法,当然既然说是旧版自然也有新版了,所以简单聊一下新版方法实现。

    新的常用方法或者类

    new ULR() 方法

    这个可以直接调用,而不用引用模块,

    格式:

    new URL(input[, base])
    
    
    • 1
    • 2
    • input 要解析的绝对或相对的输入网址。 如果 input 是相对的,则需要 base。 如果 input 是绝对的,则忽略 base。 如果 input 不是字符串,则先转换成字符串。
    • base 如果 input 不是绝对的,则为要解析的基本网址。 如果 base 不是字符串,则先转换成字符串。

    来一个例子:

    const urlobjct=new URL('/u011863822?spm=1000.2115.3001.5343','https://blog.csdn.net')
    
    console.log(urlobjct)
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    可以看出上面的结果和url.parse方法得到的结果一样,也可以根据自己的需求取出不同需要内容了。

    const url = require('url');
    // 如果前面最后不是/ 后面也没有/ 就直接替换前面/后面的内容
    url.resolve('http://example.com/one/two/three', 'four');         // 'http://example.com/one/two/four'
    
    // 如果前面最后是/ 后面也没有/ 就直接放在前面/后面
    url.resolve('http://example.com/one/two/three/', 'four');   // 'http://example.com/one/two/three/four'
    
    // 如果后面有/ 就直接放在前面/后面域名后面
    url.resolve('http://example.com/', '/one');    // 'http://example.com/one'
    url.resolve('http://example.com/one', '/two'); // 'http://example.com/two'
    
    //上面可以变成:
    let b_url=new URL('four', 'http://example.com/one/two/three'); 
    console.log(b_url.href)
    b_url=new URL('/four', 'http://example.com/one/two/three'); 
    console.log(b_url.href)
    b_url=new URL('/one', 'http://example.com/'); 
    console.log(b_url.href)
    b_url=new URL('/two', 'http://example.com/one'); 
    console.log(b_url.href)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    URLSearchParams 类

    URLSearchParams API 提供对 URL 查询的读写访问。 URLSearchParams 类也可以与以下四个构造函数之一单独使用。 URLSearchParams 类也在全局对象上可用。

    WHATWG URLSearchParams 接口和 querystring 模块具有相似的用途,但 querystring 模块的用途更通用,因为它允许自定义的分隔符(& 和 =)。 换句话说,此 API 纯粹是为网址查询字符串而设计。

    看一官网的例子:

    const myURL = new URL('https://example.org/?abc=123');
    console.log(myURL.searchParams.get('abc'));
    // 打印 123
    
    myURL.searchParams.append('abc', 'xyz');
    console.log(myURL.href);
    // 打印 https://example.org/?abc=123&abc=xyz
    
    myURL.searchParams.delete('abc');
    myURL.searchParams.set('a', 'b');
    console.log(myURL.href);
    // 打印 https://example.org/?a=b
    
    const newSearchParams = new URLSearchParams(myURL.searchParams);
    // 以上相当于
    // const newSearchParams = new URLSearchParams(myURL.search);
    
    newSearchParams.append('a', 'c');
    console.log(myURL.href);
    // 打印 https://example.org/?a=b
    console.log(newSearchParams.toString());
    // 打印 a=b&a=c
    
    // newSearchParams.toString() 是隐式调用的
    myURL.search = newSearchParams;
    console.log(myURL.href);
    // 打印 https://example.org/?a=b&a=c
    newSearchParams.delete('a');
    console.log(myURL.href);
    // 打印 https://example.org/?a=b&a=c
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    它有很多方法,还可以遍历参数如下:

    格式:

    urlSearchParams.forEach(fn[, thisArg])
    
    • 1
    • fn 为查询中的每个名称-值对调用
    • thisArg 在调用 fn 时用作 this 值

    补充:url.searchParams **获取表示网址查询参数的 URLSearchParams 对象。 **

    来一个例子:

     
    const urlobjct=new URL('https://blog.csdn.net/u011863822?a=A&b=B')
    
    urlobjct.searchParams.forEach(
        (value, key) => {
        console.log(key,value)
    });
     
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    还有urlSearchParams.sort()等方法,看名字就知道是什么意思了,不再继续演示。

    url.format() 方法

    看着和老版本的方法是似乎是一个,但是其多了参数。

    格式:

    url.format(URL[, options])
    
    • 1
    • URL WHATWG 网址对象
    • options
      • auth 如果序列化的网址字符串应包含用户名和密码,则为 true,否则为 false。 默认值: true。
      • fragment 如果序列化的网址字符串应包含片段,则为 true,否则为 false。 默认值: true。
      • search 如果序列化的网址字符串应包含搜索查询,则为 true,否则为 false。 默认值: true。
      • unicode true 如果出现在网址字符串的主机组件中的 Unicode 字符应该被直接编码而不是 Punycode 编码。 默认值: false。
    • 返回:

    演示:

    import url from 'url';
    const myURL = new URL('https://a:b@測試?abc#foo');
    
    console.log(myURL.href);
    // 打印 https://a:b@xn--g6w251d/?abc#foo
    
    console.log(myURL.toString());
    // 打印 https://a:b@xn--g6w251d/?abc#foo
    
    console.log(url.format(myURL, { fragment: false, unicode: true, auth: false }));
    // 打印 'https://測試/?abc'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    更多方法和参数可以看一下官网:http://nodejs.cn/api/url.html#url

    querystring 模块

    querystring.parse 方法

    格式如下:

    querystring.parse(str[, sep[, eq[, options]]])
    
    • 1
    • str 要解析的网址查询字符串
    • sep 用于在查询字符串中分隔键值对的子字符串。 默认值: ‘&’。
    • eq 用于在查询字符串中分隔键和值的子字符串。 默认值: ‘=’。
    • options
      • decodeURIComponent 当对查询字符串中的百分比编码字符进行解码时使用的函数。 默认值: querystring.unescape()。
      • maxKeys 指定要解析的最大键数。 指定 0 以删除键的计数限制。 默认值: 1000。
    • querystring.parse() 方法将网址查询字符串 (str) 解析为键值对的集合。

    来一个例子体验一下:

    const querystring= require('querystring')
    
    const testpara='a=A&b=B'
    console.log(querystring.parse(testpara))
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    querystring.stringify 方法

    格式:

    querystring.stringify(obj[, sep[, eq[, options]]])
    
    • 1
    • obj 要序列化为网址查询字符串的对象
    • sep 用于在查询字符串中分隔键值对的子字符串。 默认值: ‘&’。
    • eq 用于在查询字符串中分隔键和值的子字符串。 默认值: ‘=’。
    • options
      • encodeURIComponent 当将网址不安全的字符转换为查询字符串中的百分比编码时使用的函数。 默认值:
      • querystring.escape()。
        querystring.stringify() 方法通过遍历对象的"自有属性"从给定的 obj 生成网址查询字符串。

    演示:

    const querystring= require('querystring')
    jsonObject={a:'A',b:'B'}
    console.log (querystring.stringify(jsonObject))
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    在看一下官网的例子:

    querystring.stringify({ foo: 'bar', baz: ['qux', 'quux'], corge: '' });
    // 返回 'foo=bar&baz=qux&baz=quux&corge='
    
    querystring.stringify({ foo: 'bar', baz: 'qux' }, ';', ':');
    // 返回 'foo:bar;baz:qux'
    
    • 1
    • 2
    • 3
    • 4
    • 5

    querystring.escape(str)和querystring.unescape(str)

    • querystring.escape() 方法以针对网址查询字符串的特定要求优化的方式对给定的 str 执行网址百分比编码。

      querystring.unescape() 方法在给定的 str 上执行网址百分比编码字符的解码。

    • querystring.escape() 方法被 querystring.stringify() 使用,通常不会被直接使用。 导出它主要是为了允许应用程序代码在必要时通过将 querystring.escape 分配给替代函数来提供替换的百分比编码实现。

      querystring.unescape() 方法被 querystring.parse() 使用,通常不会被直接使用。 导出它主要是为了允许应用程序代码在必要时通过将 querystring.unescape 分配给替代函数来提供替代的解码实现。认情况下,querystring.unescape() 方法将尝试使用 JavaScript 内置的 decodeURIComponent() 方法进行解码。 如果失败,则将使用更安全的不会因格式错误的网址而抛出错误的同类方法。

    演示:

    const querystring= require('querystring')
    const escape_str=querystring.escape('http://example.com/')
    console.log(escape_str)
    console.log(querystring.unescape(escape_str))
    // 当然还可以作为sql语句前后端传递进行简单编码而防止简单的注入 。
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

  • 相关阅读:
    Web安全漏洞解决方案
    PTE-精听学习(四)
    Android逆向学习(三)vscode修改smali绕过vip
    [2023.09.20]:Yew的前端开发经历小结
    带你深入理解泛型
    WebLOAD: 一站式性能测试工具
    Intel汇编语言程序设计(第7版)第七章编程练习题答案
    pandoc安装使用(markdown转换为docx)
    生命在于学习——Linux学习笔记(八)启动引导
    【Java基础】继承、抽象类、注解
  • 原文地址:https://blog.csdn.net/u011863822/article/details/125559376