node.js解析/加入URL的正确方法是什么?

34gzjxbg  于 2023-03-17  发布在  Node.js
关注(0)|答案(1)|浏览(192)

如果我有这样的URL:

> u = 'http://examples.com/hello world/test'
'http://examples.com/hello world/test'

并使用node.js中内置的URL对象将其解析为组件,它会自动进行url编码:

> uObj = new URL(u)
URL {
  href: 'http://examples.com/hello%20world/test',
  origin: 'http://examples.com',
  protocol: 'http:',
  username: '',
  password: '',
  host: 'examples.com',
  hostname: 'examples.com',
  port: '',
  pathname: '/hello%20world/test',
  search: '',
  searchParams: URLSearchParams {},
  hash: ''
}

例如,现在我可以方便地更改一些属性。
问题是,如果我后来用uObj.toString()将其转换回URL字符串,它仍然是URL编码的!

> uObj.toString()
http://examples.com/hello%20world/test

然后,我将这个字符串进一步传递给另一个库/函数,该库/函数在输入中期望原始url,因此再次对其进行编码。

http://examples.com/hello%25%20world/test

(note %如何转义到%25)。
根据MDN文档,即使是内置的encodeURI()也不能根据最新的RFC处理所有可能的情况,所以我不确定decodeURI()是否正确工作?我可以只使用decodeURI(uObj.toString())并平静地睡觉吗?或者我应该在这里使用一些npm模块?

ljsrvy3e

ljsrvy3e1#

URL中的空格(SP,U+0020)字符将被编码(并保持编码状态),因为URL的路径部分不允许使用该字符。根据RFC 3986: Uniform Resource Identifier (URI): Generic Syntax,* 路径段 * 中仅允许使用以下字符

  • US-ASCII字母:一个月一个月-一个月一个月和一个月二个月-一个月三个月
  • US-ASCII十进制数字:0 - 9
  • x1米6英寸1x、x1米7英寸1x、x1米8英寸1x、x1米9英寸1x
  • 子分隔符:一个月10天一个月、一个月11天一个月、一个月12天一个月、一个月13天一个月、一个月14天一个月、一个月15天一个月、一个月16天一个月、一个月17天一个月、一个月18天一个月、一个月19天一个月、一个月20天一个月

路径本身允许X1 M2,N1 X作为段分隔符。
其他任何内容 * 必须 * 用百分比编码。

相关问题