缘起
曾几何时,在做一个数据搜索框时,发现搜索的内容如果带有特殊字符,会导致搜索异常。 第二个场景,在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中就可以完美解决这个问题了。
再放一个修改前的代码,作为对比参考: