gpt4 book ai didi

url - encodeURIComponent 与 URLSearchParams 的不同输出

转载 作者:行者123 更新时间:2023-12-03 16:12:08 29 4
gpt4 key购买 nike

我使用 URLSearchParmas 构建了一个带有查询参数的 oauth2 url API。但是,输出 URL 没有返回预期的 URL。谁能帮我理解这两个 API 之间的区别以及如何获得与 encodeURIComponent 的输出相同的结果? , 使用 URLSearchParams ?谢谢!

const expected = encodeURIComponent('code id_token'); // code%20id_token

const search = new URLSearchParams();
search.set('response_type', 'code id_token');
search.toString(); // code+id_token

最佳答案

根据WHATWG , URLSearchParams使用 application/x-www-form-urlencoded格式。虽然它适用于解码 URL 查询,但对于编码它可能会导致意外结果,例如空格被编码为 +和额外的字符,例如 ~被百分比编码。最好使用encodeURIComponent反而:
有一个对象:

const params = {
text1: 'aaa bbb',
text2: '-._*~()'
}
代替:
url.search = (new URLSearchParams(params)).toString()
采用:
url.search = Object.entries(params)
.map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`)
.join('&')
此外,根据 MDN甚至 encodeURIComponent不符合较新的 RFC 3986它定义了更多要转义的字符,例如 * .虽然如果您不将这些附加字符用作字段分隔符,可能不转义它们是安全的,但如果您想严格遵守最新的 RFC,请使用来自 MDN 的更新实现。 :
function fixedEncodeURIComponent(str) {
return encodeURIComponent(str).replace(/[!'()*]/g, function(c) {
return '%' + c.charCodeAt(0).toString(16);
});
}
一个试验场:
const params = {
text1: 'aaa bbb',
text2: '-._*~()'
}

const url1 = new URL('http://example.com')
const search1 = new URLSearchParams(params)
url1.search = search1 // Incorrect
console.log('URLSearchParams', url1.toString())

function fixedEncodeURIComponent(str) {
return encodeURIComponent(str).replace(/[!'()*]/g, function(c) {
return '%' + c.charCodeAt(0).toString(16)
})
}
const url2 = new URL('http://example.com')
const search2 = Object
.entries(params)
.map(([key, value]) => `${fixedEncodeURIComponent(key)}=${fixedEncodeURIComponent(value)}`)
.join('&')
url2.search = search2 // Correct
console.log('fixedEncodeURIComponent', url2.toString())

关于url - encodeURIComponent 与 URLSearchParams 的不同输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59889140/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com