Mock icon indicating copy to clipboard operation
Mock copied to clipboard

MockXMLHttpRequest在处理二进制流类型的response时的结果与源生方法不一致

Open musheng66 opened this issue 6 years ago • 15 comments

如题,在前后端联调下载文件时遇到了这样一个问题:服务器端返回的文件为二进制流,源生请求会正常的将其作为blob对象返回,而mock则会将其转为字符串。 源生请求返回的data中为blob 2018-06-13 5 34 20 mock重写的请求返回的data中为字符串 2018-06-13 5 36 14

另外,目前了解到mock完全重写了源生的XMLHttpRequest,所以在开发过程中包括未拦截的源生请求都会默认的被mock替代,请问是否可以选择一些请求使用源生方法? 谢谢!

musheng66 avatar Jun 13 '18 10:06 musheng66

遇到了相同问题,请问怎么解决啊

stovd avatar Nov 23 '18 07:11 stovd

如题,在前后端联调下载文件时遇到了这样一个问题:服务器端返回的文件为二进制流,源生请求会正常的将其作为blob对象返回,而mock则会将其转为字符串。 源生请求返回的data中为blob 2018-06-13 5 34 20 mock重写的请求返回的data中为字符串 2018-06-13 5 36 14

另外,目前了解到mock完全重写了源生的XMLHttpRequest,所以在开发过程中包括未拦截的源生请求都会默认的被mock替代,请问是否可以选择一些请求使用源生方法? 谢谢!

大佬,你是怎么解决的啊,mockRequest对象返回的是字符串,我加载音频的时候需要的是二进制流啊

stovd avatar Nov 27 '18 08:11 stovd

@stovd 搜了3个小时找到这里,最后找到一个ugly的解决思路,亲测可用 image

choiy avatar Nov 30 '18 07:11 choiy

https://github.com/Hugo-X/Mock/commit/2a6cc9ce7cfa407ce0036c187a6de1803f567884

这个改动应该也可以解决问题

Hugo-X avatar Dec 06 '18 16:12 Hugo-X

克隆最新的mockjs好像依旧,会将二进制类型强转成字符串类型

masonjs-cn avatar May 21 '19 07:05 masonjs-cn

太坑了吧,哪有直接覆盖重写原生的啊,我被这个问题整福气了

谢谢楼上

shu681 avatar Jun 23 '20 03:06 shu681

TM的,找一下午不知道为什么我的音频文件请求过来后不能播放,结果发现明明设置axios的responseType=arraybuffer,但是接到的内容不是arraybuffer,坑死个人啊

procedure-ape avatar Apr 13 '22 08:04 procedure-ape

哈哈哈哈,试试使用 https://github.com/wll8/mockm 救你于苦海。

wll8 avatar Apr 13 '22 08:04 wll8

这是来自QQ邮箱的假期自动回复邮件。  

sharywkd avatar Apr 13 '22 08:04 sharywkd

我这导出excel,我人都麻了,找半天找不到问题

ding139725 avatar May 31 '22 11:05 ding139725

这是来自QQ邮箱的假期自动回复邮件。  

sharywkd avatar May 31 '22 11:05 sharywkd

有谁能联系到作者,可不可以把这个问题先修复了,又不麻烦,又拖了这么久。。。。。。

Undefined100 avatar Jul 31 '23 01:07 Undefined100

作者几年没有更新代码了,所以这不是麻烦不麻烦的问题,这是这个库已经不维护了的现象。

wll8 avatar Jul 31 '23 02:07 wll8

这个仓库已经不维护了,我fork了一份已经解决,可以使用我fork的仓库 tony-mockjs

npm i tony-mockjs

我的代码里里面使用了threejs,具体的responseType值会是 text|ArrayBuffer|json,目前工作良好

具体核心代码如下

image

ygweric avatar Sep 12 '23 08:09 ygweric

function blobRequest () {
    if (window['_XMLHttpRequest']) {
      window['_mockXMLHttpRequest'] = window['XMLHttpRequest']
      window['XMLHttpRequest'] = window['_XMLHttpRequest']
    }
    return new Promise(async (resolve) => {
      const res = await axios.call(null, ...arguments)
      if (window['_mockXMLHttpRequest']) {
        window['_XMLHttpRequest'] = window['XMLHttpRequest']
        window['XMLHttpRequest'] = window['_mockXMLHttpRequest']
        delete window['_mockXMLHttpRequest']
      }
      return resolve(res)
    })
  }

可以单独封装一个方法,二进制流的业务场景只调用这个方法。 当然,以上代码中,axios 可以是任意一个 http 库。

jimole775 avatar Feb 22 '24 10:02 jimole775