WHATWG URL的origin
属性包括protocol
和host
,但不包含username
和password
┌─────────────────────────────────────────────────────────────────────────────────────────────┐
│ href │
├──────────┬──┬─────────────────────┬─────────────────────┬───────────────────────────┬───────┤
│ protocol │ │ auth │ host │ path │ hash │
│ │ │ ├──────────────┬──────┼──────────┬────────────────┤ │
│ │ │ │ hostname │ port │ pathname │ search │ │
│ │ │ │ │ │ ├─┬──────────────┤ │
│ │ │ │ │ │ │ │ query │ │
" https: // user : pass @ sub.host.com : 8080 /p/a/t/h ? query=string #hash "
│ │ │ │ │ hostname │ port │ │ │ │
│ │ │ │ ├──────────────┴──────┤ │ │ │
│ protocol │ │ username │ password │ host │ │ │ │
├──────────┴──┼──────────┴──────────┼─────────────────────┤ │ │ │
│ origin │ │ origin │ pathname │ search │ hash │
├─────────────┴─────────────────────┴─────────────────────┴──────────┴────────────────┴───────┤
│ href │
└─────────────────────────────────────────────────────────────────────────────────────────────┘
(请忽略字符串中的空格,它们只是为了排版需要)
利用WHATWG API解析一个URL字符串
const { URL } = require('url')
const myURL = new URL('https://user:pass@sub.host.com:8080/p/a/t/h?query=string#hash')
console.log(myURL)
在浏览器中,WHATWG URL是全局可用的,而在Nodejs中,任何情况下打开或使用一个链接都必须事先引用‘URL’模块:require('url').URL
通过node提供的API解析一个URL:
const url = require('url')
const myURL = url.parse('https://user:pass@sub.host.com:8080/p/a/t/h?query=string#hash');
Class:URL
注意:根据浏览器的约定,URL对象的所有属性都是在类的原型上实现为getter和settter,而不是作为对象本身的数据属性,因此,与「遗留的urlObjects[]」不同,在URL对象的任何属性,(例如)delete myURL.protocol
,delete myURL.pathname
等)上使用 delete 关键字没有任何效果,但仍返回true
Constructor:new URL(input[,base])
- input 要解析的输入URL
- base 如果
input
是相对 URL,则为要解析的基本URL
通过将input解析到base上创建一个新的URL对象,如果base是一个字符串,则解析方法与new URL(base)
const { URL } = require('url');
const myURL = new URL('/foo', 'https://example.org/');
// https://example.org/foo
如果input或base是无效URLs,将会抛出TypeError。请注意给定值将被强制转换为字符串。例如:
const { URL } = require('url');
const myURL = new URL({ toString: () => 'https://example.org/' });
如果URL中存在Unicode字符被使用Punycode算法自动转换为ASCII
const { URL } = require('url');
const myURL = new URL('https://你好你好');
// https://xn--6qqa088eba/
url.hash
const { URL } = require('url');
const myURL = new URL('https://example.org/foo#bar');
console.log(myURL.hash);
// 输出 #bar
myURL.hash = 'baz';
console.log(myURL.href);
// 输出 https://example.org/foo#baz
url.host
获取及设置URL的主机(host)部分。
const { URL } = require('url');
const myURL = new URL('https://example.org:81/foo');
console.log(myURL.host);
// 输出 example.org:81
myURL.host = 'example.com:82';
console.log(myURL.href);
// 输出 https://example.com:82/foo
url.hostname
获取及设置URL的主机名(hostname)部分。 url.host和url.hostname之间的区别是url.hostname不 包含端口。
const { URL } = require('url');
const myURL = new URL('https://example.org:81/foo');
console.log(myURL.hostname);
// 输出 example.org
myURL.hostname = 'example.com:82';
console.log(myURL.href);
// 输出 https://example.com:81/foo
url.href
const { URL } = require('url');
const myURL = new URL('https://example.org/foo');
console.log(myURL.href);
// 输出 https://example.org/foo
myURL.href = 'https://example.com/bar';
console.log(myURL.href);
// 输出 https://example.com/bar
获取href 属性的值等同于调用url.toString()
url.origin
const { URL } = require('url');
const myURL = new URL('https://example.org/foo/bar?baz');
console.log(myURL.origin);
// 输出 https://example.org
url.password
获取及设置URL的密码(password)部分。
const { URL } = require('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
url.pathname
获取及设置URL的路径(path)部分
const { URL } = require('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
url.port
获取及设置URL的端口(port)部分。
const { URL } = require('url');
const myURL = new URL('https://example.org:8888');
console.log(myURL.port);
// 输出 8888
// 默认端口将自动转换为空字符
// (HTTPS协议默认端口是443)
myURL.port = '443';
console.log(myURL.port);
// 输出空字符
console.log(myURL.href);
// 输出 https://example.org/
myURL.port = 1234;
console.log(myURL.port);
// 输出 1234
console.log(myURL.href);
// 输出 https://example.org:1234/
// 完全无效的端口字符串将被忽略
myURL.port = 'abcd';
console.log(myURL.port);
// 输出 1234
// 开头的数字将会被当做端口数
myURL.port = '5678abcd';
console.log(myURL.port);
// 输出 5678
// 非整形数字将会被截取部分
myURL.port = 1234.5678;
console.log(myURL.port);
// 输出 1234
// 超出范围的数字将被忽略
myURL.port = 1e10;
console.log(myURL.port);
// 输出 1234
端口值可以被设置为数字或者包含数字的字符串,数字范围0~65535(包括)
。为给定protocol的URL对象设置端口值将会导致port值变成空字符('')
如果给port属性设置的值是无效字符串,但如果字符串以数字开头,那么开头部位的数字将会赋值给port,否则,包括如果数字超出上述要求的数字,将被忽略
url.protocol
获取及设置URL的协议(protocol)部分。
const { URL } = require('url');
const myURL = new URL('https://example.org');
console.log(myURL.protocol);
// 输出 https:
myURL.protocol = 'ftp';
console.log(myURL.href);
// 输出 ftp://example.org/
如果给protocol属性设置的值是无效值,那么该值将被忽略。
url.search
获取及设置URL的序列化查询(query)部分部分。
const { URL } = require('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
url.searchParams
获取表示URL查询参数的URLSearchParams
对象。该属性是只读的;使用url.search
设置来替换URL的整个查询参数。请打开URLSearchParams
文档来查看更多细节。
url.username
获取及设置URL的用户名(username)部分。
const { URL } = require('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/
url.toString()
在URL
对象上调用toString()
方法将返回序列化的URL。返回值与url.href
和url.toJSON()
的相同。
url.toJSON
在URL
对象上调用toJSON()
方法将返回序列化的URL。返回值与url.href
和url.toString()
的相同。
const { URL } = require('url');
const myURLs = [
new URL('https://www.example.com'),
new URL('https://test.example.org')
]
console.log(JSON.stringify(myURLs))
Class:URLSearchParams
URLSearchParams
API接口提供URL query 部分的读写权限
const { URL, URLSearchParams } = require('url');
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
网友评论