javascript - 识别和编码网址的问题
问题描述
我在解析/操作 URI 时遇到问题:
问题陈述:
我想编码 f[users.comma] 并返回它。
[Case-1] 我从后端服务获取一个 url,编码 f[users.comma] 并返回它。
[Case-2] 我从后端服务获得一个 url,并且 f[users.comma] 已经编码。所以不要双重编码并返回它。
预期输出:
`/demo/bigquery/order_items?fields=users.email&f[users.comma]=%22Abbeville%2C+Georgia%22`
代码:
const encodedExample = `/demo/bigquery/order_items?fields=users.email&f[users.comma]=%22Abbeville%2C+Georgia%22` // the last param is encoded
const regularExample2 = `/demo/bigquery/order_items?fields=users.email&f[users.comma]="Abbeville, Georgia"` //
const specialEncode = (url) => {
for (let queryParam of urlObj) {
const [urlKey, urlValue] = queryParam
// Check to see if url contains f[users.comma]
if (urlKey.includes('f[')) {
urlObj.set(urlKey, encodeURI(urlValue))
}
}
return urlObj.toString() // doesn't seem to work
}
我觉得我的方法正在越野。我很感激这里的一些帮助。
解决方案
由于后端服务返回一个编码或解码的 url
我们可以先从后端服务解码 url(如果 url 已经编码,这不会产生任何异常)
const encodedExample = `/demo/bigquery/order_items?fields=users.email&f[users.comma]=%22Abbeville%2C+Georgia%22` // the last param is encoded
const regularExample2 = `/demo/bigquery/order_items?fields=users.email&f[users.comma]="Abbeville, Georgia"`
const specialEncode = (url) => {
let decodedUrl = decodeURI(url);
let encodedUrl = encodeURI(decodedUrl);
// fix "f[users.comma]" because encodeURI will encode the [ and ] as well
encodedUrl = encodedUrl.replace("f%5Busers.comma%5D", "f[users.comma]")
console.log(encodedUrl);
return encodedUrl;
}
specialEncode(encodedExample); // logs and returns: /demo/bigquery/order_items?fields=users.email&f[users.comma]=%22Abbeville%252C+Georgia%22
specialEncode(regularExample2); // logs and returns: /demo/bigquery/order_items?fields=users.email&f[users.comma]=%22Abbeville%252C+Georgia%22
上面的代码适用于编码和解码的 url
推荐阅读
- c - 方法返回的指针未正确分配给 C 中定义的另一个指针
- python - UnicodeDecodeError:“charmap”编解码器无法解码位置 743 中的字节 0x9d:字符映射到
- flutter - 颤振 - 提供者
- google-bigquery - 将 CSV 上传附加到现有 BigQuery 表时出现问题
- javascript - 选择一条线来改进。初学者效率代码问题
- cloudflare - 在 Cloudflare 工作器中缓存每个获取请求
- c# - 成功保存记录后显示消息
- java - setOnClickListener 中的 SQLException(new View.OnClickListener() - Android Studio
- javascript - 使用 FileReader 发送原始文件数据
- lotus-domino - 在 Domino 服务器端签署数据库