• 关于URL的一些基础内容
  • URL模块的API解析
  • URL的参数URLSearchParams类
  • querystring模块

 一、关于URL的一些基础内容

1.1 定义:

  在WWW上,每一信息资源都有统一的且在网上唯一的地址,该地址就叫URL(Uniform Resource Locator,统一资源定位符),它是WWW的统一资源定位标志,就是指网络地址。

1.2 URL的组成部分:(以下面这个URL为例)

http://www.baidu.com:8080/news/index.asp?boardID=5&ID=24618&page=1#name

①协议部分:在双斜杠(//)前面的部分,示例中的协议部分是“http:”,在Internet中可以使用多种协议,如HTTP、FTP等。

②域名部分:例如示例中的“www.baidu.com”就是URL的域名部分。

③端口部分:端口部分不是URL的必须部分,在上面这个URL示例中包含有端口部分“8080”,端口与域名被冒号间隔开。

④虚拟目录部分:从URL中的第一个但斜杠(/)开始,到最后一个但斜杠(/),都是虚拟目录部分,示例中的“/news/”就是虚拟目录部分。

⑤文件名部分:最后一个但斜杠(/)后面就是文件名部分,有些URL没有参数和锚,文件名部分就会是URL的最后一个部分,这个示例中的文件名部分就是“index.asp”。

⑥参数部分:URL的参数部分是在问号(?)后面,如果URL没有有锚的话,参数就是URL的最后部分,这个示例中的参数部分是“boardID=5&ID=24618&page=1”。通常参数部分又被称为搜索部分、查询部分。

⑦锚部分:从井号(#)到最后,都是锚部分。示例中的锚部分是“name”

1.3 URL字符串与URL对象

在前面的URL组成分析中可以了解到URL的字符串类型,但是为了方便数据操作,通常需要在URL字符串与URL对象间进行转换。在node中存在两种转换方式,第一种是通过url模块上的url.parse(url)将URL字符串转换成URL对象;第二种是通过URL类的构造方式将URL字符串转换成URL对象。

需要注意的是url.parse()已被废弃,但目前不影响使用。URL类是基于HTML5标准中的WHATWG URL 标准实现实现的最新标准API。通过官方这张对比图来了解以下它们两者的异同:

nodejs入门API之url模块+querystring模块

 

上方的是遗留的 url.parse() 返回的对象的属性。 下方的则是 WHATWG 的 URL 对象的属性。

通过对比可以看到,url.parse()生成的auth被username与password替代;并且新增了origin属性,还有一个细节需要注意,在新标准中取消了query属性。新版本还增加了一个URLSearchParams 类来解析URL字符串中的数据。

 二、URL模块的API解析

2.1 new URL(input[,base])

通过URL字符串构造RUL对象。当URL字符串(input)是相对路径时,需要传入(base)以协议、主机地址、端口构成的基础地址。当然,如果RUL相对的是虚拟目录路径的话还需要相对的虚拟目录路径组成。

如果开启了国际化(ICU)模式,在构造时遇到Unicode字符时,将被使用Punycode算法自动转换成转换成ASCLL字符。

//解析相对的URL
const myURL1 = new URL('/foo', 'https://example.org/');
//myURL1.href = https://example.org/foo

//解析绝对的URL
const myURL2 = new URL('https://example.org/foo/index.html');
//myURL2.href = https://example.org/foo/index.html

//国际化解析带Unicode字符串的URL字符串
const myURL3 = new URL('https://测试');
//myURL3.href = https://xn--0zwm56d/

2.2 url.toString()

在url对象上调用toString()方法将返回序列化的URL。但是url.toString()由于不能自定义URL的序列化过程,实际上与rul.fref、url.toJSON()没什么区别。例如:

let urlM = require('url')
let url = new URL("https:127.0.0.1:12306/html/index.html?a=10&b=20");
console.log(url.href);
console.log(url.toString());
console.log(url.toJSON());
console.log(urlM.format(url));
//以上所有打印结果都是:https://127.0.0.1:12306/html/index.html?a=10&b=20

在上面的示例中有一个urlM.format()方法,这个方法也是用来实现URL对象序列化的方法,不过这个方法不是node内置类URL的方法,而是url模块的上的方法。

url模块上的format(URL[,options])可以通过options来配置自定义的URL序列化,自定义项分别有(默认值都为true,表示都包含):

auth<boolean>:是否包含用户名和密码;

fragment<boolean>:是否包含锚部分。

search<boolean>:是否包含参数部分(搜索查询部分)。

unicode<boolean>:是否将Unicode字符转换成ASCLL字符。

let urlM = require("url");

//示例一
let url = new URL('https://user:pass@sub.example.com:8080/p/a/t/h?query=string#hash');
console.log(url.href);
console.log(urlM.format(url,{auth:false,fragment:false,search:false}));
//打印结果
//https://user:pass@sub.example.com:8080/p/a/t/h?query=string#hash
//https://sub.example.com:8080/p/a/t/h

//示例二
const myURL = new URL('https://a:b@測試?abc#foo');
console.log(urlM.format(myURL, { fragment: false, unicode: true, auth: false }));
//打印结果:'https://測試/?abc'

在url.toString()的相关内容中,涉及到了rul.fref、url.toJSON()、url.format(URL[,options]),后面就不再对这些API重复解析了。

2.3 url.origin:获取只读的序列化的URL的orgin。(基本路径,包括:协议、身份信息、主机:域名+端口、IP+端口)

let url = new URL('https://user:pass@sub.example.com:8080/p/a/t/h?query=string#hash');
console.log(url.origin);//https://sub.example.com:8080

2.4 url.password:获取及设置URL的密码部分。

const myURL = new URL('https://abc:xyz@example.com');
console.log(myURL.password);
  // 打印 xyz

myURL.password = '123';
console.log(myURL.href);
  // 打印 https://abc:123@example.com

2.5 url.pathname:获取及设置url的虚拟目录部分。

const myURL = new URL('https://example.org/abc/xyz?123');
console.log(myURL.pathname);
  // 打印 /abc/xyz

myURL.pathname = '/abcdef';
console.log(myURL.href);
  // 打印 https://example.org/abcdef?123

2.6 url.port 获取及设置URL的端口部分。

端口值可以是数字或包含 0 到 65535(含)范围内的数字字符串。 将值设置为给定 protocol 的 URL 对象的默认端口将会导致 port 值变为空字符串('')。

端口为空字符串时,端口取决于协议/规范的默认端口。

2.7 url.protocol:获取及何止URL的协议部分。

const myURL = new URL('https://example.org');
console.log(myURL.protocol);
// 打印 https:

myURL.protocol = 'ftp';
console.log(myURL.href);
// 打印 ftp://example.org/

2.8 url.search:获取及何止URL的序列化查询部分参数部分。

const myURL = new URL('https://example.org/abc?123');
console.log(myURL.search);
// 打印 ?123

myURL.search = 'abc=xyz';
console.log(myURL.href);
// 打印 https://example.org/abc?abc=xyz

2.9 url.searchParams:获取表示URL查询参数的URLSearchParams对象,该属性为只读。

 关于url.searchParams详细见URLSearchParams类。

2.10 url.username:获取及设置URL的用户名部分。

const myURL = new URL('https://abc:xyz@example.com');
console.log(myURL.username);
// 打印 abc

myURL.username = '123';
console.log(myURL.href);
// 打印 https://123:xyz@example.com/

2.11 url模块的一些其他方法:

url.fileURLToPath(url):用来将文件URL或URL对象转换成当前node所在系统对应的文件路径。

 1 new URL('file:///C:/path/').pathname;    // 错误: /C:/path/
 2 fileURLToPath('file:///C:/path/');       // 正确: C:\path\ (Windows)
 3 
 4 new URL('file://nas/foo.txt').pathname;  // 错误: /foo.txt
 5 fileURLToPath('file://nas/foo.txt');     // 正确: \\nas\foo.txt (Windows)
 6 
 7 new URL('file:///你好.txt').pathname;    // 错误: /%E4%BD%A0%E5%A5%BD.txt
 8 fileURLToPath('file:///你好.txt');       // 正确: /你好.txt (POSIX)
 9 
10 new URL('file:///hello world').pathname; // 错误: /hello%20world
11 fileURLToPath('file:///hello world');    // 正确: /hello world (POSIX)
View Code

相关文章: