是否可以重试我拦截的XMLHttpRequest?

时间:2017-03-13 21:57:21

标签: javascript ajax cookies xmlhttprequest

我正在覆盖XMLHttpRequest.prototype.send = function(a,b) { }XMLHttpRequest.prototype.open = function(a,b) { },因此我可以拦截每次ajax调用得到的每一个响应。有时,其中一些请求失败,当发生这种情况时,我需要更新DOM的cookie并重试失败的原始XHR。

考虑到我无法控制那些XHR,意味着我不创建或执行它们,我是否可以使用新的更新cookie重试那些XHR?

现在,我将原始XHR保存在一个新变量中,当它失败时,我会执行xhr.open.apply()然后xhr.send.apply()。使用像Charles这样的HTTP Web代理,我能够检查我的响应,并且总是收到错误消息:无效的请求...我也意识到原始XHR和重试的XHR之间的区别在于X-Request-With标头是总是失踪。

有关如何解决此问题的任何想法?

1 个答案:

答案 0 :(得分:1)

嗯,这是可能的,我设法做到了。

我创建了一个重试原始请求的函数,在那里我传递了传递给XMLHTTPRequest.prototype.send函数的相同参数,该函数在发送之前拦截了XMLHTTPRequest。

function retryOriginalRequest(a,b, args) {
   var originalRequest = new XMLHttpRequest();
   originalRequest.open(a,b, true);
   // The request headers need to be set up after the open call and before the send.
   originalRequest.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
   originalRequest.send(args, null); 
};