URL编码【详解】——Javascript对URL进行编码解码的三种方式的区别和使用场景,axios请求拦截器中对get请求的参数全部进行URL编码

简介: URL编码【详解】——Javascript对URL进行编码解码的三种方式的区别和使用场景,axios请求拦截器中对get请求的参数全部进行URL编码

为什么需要URL编码?

根据网络标准RFC 1738的硬性规定:

"只有字母和数字[0-9a-zA-Z]、一些特殊符号"$-_.+!*'(),"[不包括双引号]、以及某些保留字,才可以不经过编码直接用于URL。"

即URL不支持汉字,[] 等字符。

但在使用URL传参时(如get请求),参数值经常包含汉字,[] 等字符,怎么办?

将这些URL不支持的字符进行编码后使用。

如  https://www.baidu.com/s?wd=春节  编码后为  春节_百度搜索

为什么浏览器中的网址可以有中文等URL不支持的字符?

因为浏览器对非法URL自动进行了编码!

虽然浏览器的地址栏中,看到的URL包含中文,但实际的网络请求对URL进行了编码

为什么要主动对URL进行编码?

虽然浏览器自己会对URL进行编码,但不同的操作系统、不同的浏览器、不同的网页字符集,将导致完全不同的编码结果。(详见 关于URL编码 - 阮一峰的网络日志 )

服务器不可能对错综复杂的编码结果进行处理,所以,需要使用Javascript先对URL编码,然后再向服务器提交,不给浏览器插手的机会。

因为Javascript的输出总是一致的,就保证了服务器得到的数据格式的统一。

Javascript对URL进行编码

以下三种函数都可以对URL进行编码,区别主要在于不编码的字符不同,具体使用详见各自的使用场景:

encodeURIComponent() 【推荐】

  • 使用场景:对url中的参数进行编码
  • 不编码的字符: ~!*()

encodeURI()

  • 使用场景:对整个url进行编码
  • 不编码的字符: ~!@#@{content}*()=:/,;?+'

escape() 【不推荐】

  • 不编码的字符:@*/+
  • 在用户提交的表单字段中,如果有空格,则会被转化为+字符,而服务器解析的时候则会认为+号代表空格。由于这个缺陷,应当尽量避免使用escape方法。

Javascript对URL进行解码

当Javascript需要从URL中解析出参数时,获取到的URL通常是已编码的,所以需要先对URL进行解码,再进行解析。

以下三种函数都可以对URL进行解码,与编码函数一一对应。

  • unencodeURIComponent(string)
  • unencodeURI(string)
  • unescape(string)

实战案例——axios请求拦截器中,对get请求的参数全部进行URL编码

// 添加请求拦截器
axios.interceptors.request.use(function(config) {
 
    // 对get请求的参数全部进行URL编码
    let url = config.url
 
    if (config.method === 'get' && config.params) {
        url += '?'
        let keys = Object.keys(config.params)
        for (let key of keys) {
            url += `${key}=${encodeURIComponent(config.params[key])}&`
        }
        url = url.substring(0, url.length - 1)
        config.params = {}
    }
    config.url = url
 
    return config;
}, function(error) {
    return Promise.reject(error);
});

目录
相关文章
|
Java
Java开发实现图片URL地址检验,如何编码?
【10月更文挑战第14天】Java开发实现图片URL地址检验,如何编码?
656 4
|
10月前
|
JavaScript 前端开发 开发者
Nest.js控制器深度解析:路由与请求处理的高级特性
以上就是对 NestJS 控制层高级特性深度解析:从基本概念到异步支持再到更复杂场景下拦截其与管道等功能性组件运用都有所涉及,希望能够帮助开发者更好地理解和运用 NestJS 进行高效开发工作。
523 15
|
JavaScript 前端开发 API
Node.js中发起HTTP请求的五种方式
以上五种方式,尽管只是冰山一角,但已经足以让编写Node.js HTTP请求的你,在连接世界的舞台上演奏出华丽的乐章。从原生的 `http`到现代的 `fetch`,每种方式都有独特的风格和表现力,让你的代码随着项目的节奏自由地舞动。
1028 65
|
API Kotlin
动态URL构建与HTTP请求的Kotlin实现
动态URL构建与HTTP请求的Kotlin实现
|
JavaScript 前端开发 容器
this、self、window、top 在 JavaScript 中的区别深入研究
在 JavaScript 开发中,`this`、`self`、`window` 和 `top` 是四个常用的概念。`this` 指向当前执行上下文的对象,其值取决于函数调用方式;`self` 在全局作用域中等同于 `window`,常用于 Web Workers;`window` 代表浏览器窗口,是全局变量的容器;`top` 指向最顶层窗口,用于判断是否在框架中。理解这些概念有助于编写健壮的代码。
547 1
this、self、window、top 在 JavaScript 中的区别深入研究
|
JavaScript 前端开发 API
JavaScript中通过array.map()实现数据转换、创建派生数组、异步数据流处理、复杂API请求、DOM操作、搜索和过滤等,array.map()的使用详解(附实际应用代码)
array.map()可以用来数据转换、创建派生数组、应用函数、链式调用、异步数据流处理、复杂API请求梳理、提供DOM操作、用来搜索和过滤等,比for好用太多了,主要是写法简单,并且非常直观,并且能提升代码的可读性,也就提升了Long Term代码的可维护性。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
移动开发 运维 供应链
通过array.some()实现权限检查、表单验证、库存管理、内容审查和数据处理;js数组元素检查的方法,some()的使用详解,array.some与array.every的区别(附实际应用代码)
array.some()可以用来权限检查、表单验证、库存管理、内容审查和数据处理等数据校验工作,核心在于利用其短路机制,速度更快,节约性能。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
供应链 JavaScript 前端开发
通过array.every()实现数据验证、权限检查和一致性检查;js数组元素检查的方法,every()的使用详解,array.some与array.every的区别(附实际应用代码)
array.every()可以用来数据验证、权限检查、一致性检查等数据校验工作,核心在于利用其短路机制,速度更快,节约性能。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
JavaScript
Node.js GET/POST请求
10月更文挑战第6天
285 2
Node.js GET/POST请求