axios中get传参传递特殊字符

3,485 阅读2分钟

缘起

曾几何时,在做一个数据搜索框时,发现搜索的内容如果带有特殊字符,会导致搜索异常。 第二个场景,在fittime后台管理系统中,搜索食材输入中括号,引发了接口报错400。

究因

通过仔细观察代码,看到代码中对搜索的内容并没有进行编码,所以我就确认,这个bug是因为搜索的内容中带有特殊字符导致的。

探索

所以我很自信的对搜索内容使用了encodeURIComponent对搜索内容进行编码。 然而,惊喜发生了。 接口依然报错了。 打开控制台,发现,中括号并没有被编码。

这就很气。 然后查看代码写法

this.$get()方法是通过对axios封装,挂载在VUE全局实例上的。 感觉这样传参好像也没有什么问题,对参数编码然后拼在url中,这应该是OK的呀?

再究

无奈之下,打开axios查看源码 在创建xhr请求时,对请求参数做了一个buildURL处理。方法路径为:axios/lib/helper/builderUrl.js 这个文件中记载着这样一件事:

意思就是将参数进行了encodeURIComponent编码,然后又把下列的特殊字符转义回去了。所以在输入中括号的时候,请求的url中依然显示的为"[" 和 "]"。

正义

我们的使命是让正义得到伸张,bug得到解决。那么在不改动源码的前提下,我们怎么能正确对这个特殊字符进行编码呢?

其实答案很简单,参数不放在params中不就行了呗。 axios对url的处理没有那么复杂,仅仅是执行了combineURLs,文件路径:(axios/lib/helpers/combineURLs.js)

我们直接手动对参数进行编码然后拼接成字符串,再拼回url中就可以完美解决这个问题了。

再放一个修改前的代码,作为对比参考: