不要再复制了,url 空白编码引起的事故!!!

最近在联调接口时发现了一个要命的问题,就是接口url明明是正确的,可是发送就是不成功,报404异常的错误javascript

代码

伪代码以下,一个很正常的删除数据请求vue

function foo(id) {
  return axios({
    method: 'delete',
    url: '​/api​/resume​/queue​/' + id
  })
}

报错

报错以下:
image.pngjava

这里和后端一块儿验证过了,确实有这个接口,使用postman请求是没问题的

查资料,反复验证

而后本身写了个接口模拟了下,没有重现这个问题,请求其它 api 也都正常ios

接着就是查各类资料,刚开始一度觉得是 delete 请求、vue-cli的锅,查了各类资料,但仍是一无所得vue-cli

沉思

最后看着 DELETE http://localhost:8070/%E2%80%8B/api%E2%80%8B/resume%E2%80%8B/queue%E2%80%8B/81862404 404 (Not Found) 这一段报错信息陷入了沉思axios

404请求确定是接口地址不正确的问题,可是这里的路径看着没问题(但也只是看着)后端

这里发现最后请求的路径加入了一些编码,也就是 %E2%80%8B 这个,而后在控制台调用 decodeURI('%E2%80%8B') ,返回 '' 空字符串,看到这里应该明白了,嗯,倒吸一口凉气...api

缘由

若是将光标移动到 上面 url 路径上,会发现每一个/前面须要移动两次才能跳过,其实那儿确实有一个特殊的字符,只是它没有宽度,让人误觉得是什么也没有,可是若是 encodeURI 编码一下会发现确实是有东西的,也就是 %E2%80%8B浏览器

最后发现,仍是由于偷懒图方便,接口地址直接从 swagger 文档那边复制过来的,而复制源里面的字符存在空白编码%E2%80%8B,空白编码没有宽度,虽然看不到可是会致使没法精确匹配出现问题,浏览器对请求路径会自动编码,这样路径彻底就不同了,这个后端路由没法识别,固然就404了post

网上查了下,%E2%80%8E 的学名叫 Zero-width-space(零宽空格) ,顾名思义,它是一个Unicode字符,肉眼不可见,倒是确实存在的一个字符

解决

  • 一时复制一时爽,一直复制一直爽,你没法确认你复制的字符是否存在空白编码,因此少点复制,仍是老老实实手敲一遍吧,尤为是字符串的部分
  • 从开发者的角度来看,能经过代码解决的确定更好,其实能够在发送请求以前对 url 作个正则匹配,将%E2%80%8B替换掉

伪代码:

// 在请求发送前
url = decodeURI(encodeURI(url).replace(/%E2%80%8B/g, ''))

遇到这个问题其实挺无奈的,一个并不起眼的地方,若是你不注意,会致使你作不少无用功

相关文章
相关标签/搜索