目录
前言
场景
问题
解决
前言
在项目开发中肯定会涉及到下载导出功能,对于开发人员来说一般习惯使用谷歌、火狐等其他浏览器进行功能测试,例如谷歌浏览器支持加入扩展程序,扩展程序的位置在:点击右上角三个点==>找到设置点开==>点击左下扩展程序选项就可以看到浏览器汇总所有的扩展程序应用,我的扩展程序如下图所示:
像迅雷的扩展程序,平时在谷歌浏览器中下载东西我基本都会用到,特别是下载较大文件时,觉得迅雷速度会快一点更清晰,所以也就一直开启并没有在意这回事。
场景
临时有个项目需要二开,然后涉及到导出功能的修改,于是我在本地跑源代码先进行测试原有功能,然后就发现大部分导出功能都失败(在谷歌浏览器使用迅雷组件下载),这个时候就很纳闷,明明线上平台所有功能都是正常的为什么在本地测试导出功能就不行了呢,于是针对这个问题进行了长时间多环境测试。
问题
系统中一共有8个导出功能,其中7个导出在本地测试都失败,只有一个导出在本地测试成功下载,对比后发现请求类型不一样,导出成功的接口是GET类型请求,导出失败的接口是POST类型请求,区别就是参数放在了url后面和body中,然后又通过debug查看代码,发现导出时调用了两次接口(但是在network中仍然只有一次),这个情况就很奇怪,明明一次调用就可以为什么会出现调用两次,当调用第二次时network中也没有记录并且body中的参数也都不见了,所以才会现在前面的情况:GET类型请求成功,POST类型请求失败;
根据情况来看需要解决的问题应该是为什么会出现第二次调用,是什么原因导致出现这种情况的呢,然后就将问题锁定在导出时的动作,当点击页面导出功能时属于第一次调用接口,network监测到记录属于正常,这个时候浏览器会默认打开迅雷组件,如下图所示:
然后当我点击这个立即下载的时候就出现了第二次调用接口的情况,并且这次调用没有传递任何参数,就导致了接口失败无法返回文件流下载,也就对应上了前面出现的问题(皆大欢喜)。
解决
既然发现了问题那么解决起来就很简单了,只需要在扩展程序中将迅雷组件暂时禁用就可以,然后再测试同样的功能就会发现可以正常导出了,这个坑确实挺有意思的。