从xhr对象获取请求URL

时间:2009-05-28 14:40:08

标签: javascript

有没有办法从xhr对象中提取请求网址? 我可以通过channel属性看到firebug中的url,但是你无法使用javascript查询它。

6 个答案:

答案 0 :(得分:31)

如果您使用的是jQuery,则可以在AJAX请求中使用“beforeSend”函数来修改jqXHR对象。即,

$.ajax({
...
url: "http://some/url",
beforeSend: function(jqxhr, settings) { jqxhr.requestURL = "http://some/url"; },
...
});

传递给各种回调的jqXHR对象将具有您可以访问的变量jqXHR.requestURL

答案 1 :(得分:23)

如果发生以下黑客攻击,则不需要包装:

var xhrProto = XMLHttpRequest.prototype,
    origOpen = xhrProto.open;

xhrProto.open = function (method, url) {
    this._url = url;
    return origOpen.apply(this, arguments);
};

用法:

var r = new XMLHttpRequest();
r.open('GET', '...', true);
alert(r._url); // opens an alert dialog with '...'

答案 2 :(得分:6)

我希望我能正确理解你的问题。

使用您自己的对象包装XHR对象应该相当简单,以允许这种功能。

以下是一个过于简化的例子:

// Assumption: GetXHR() returns a new XHR object, cross browser.

function HTTPGet(url, onStartCb, onCompleteCb)
{
  var xhr = GetXHR();
  // Construct your own xhr object that contains the url and the xhr object itself.
  var myXhr = { xhr: xhr, url: url };

  xhr.onreadystatechange = function()
  {
     if (xhr.readyState == 4 && xhr.status == 200)
     {
        onCompleteCb(myXhr);
     }
  };

  xhr.open("GET", url);
  onStartCb(myXhr);
  xhr.send(null);
}

我没有对此进行过广泛的测试,但是它应该可以工作并进行一些修改(错误处理,传递参数等),您应该可以将此示例转换为功能完备的解决方案。

答案 3 :(得分:5)

根据https://developer.mozilla.org/en/XmlHttpRequest,如果您拥有提升的权限,您确实可以获得channel;但是,channel是非标准的(可能在其他浏览器中不起作用),实际上http://www.w3.org/TR/XMLHttpRequest/的W3C规范没有提及channel,也没有提及“提取请求URL”的任何其他方式。因此,我怀疑在浏览器中没有办法合理地这样做。

答案 4 :(得分:1)

一些有用的相关属性是:


xhr2

dist-https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/responseURL

IE不支持此功能。


获取

如果您使用的是fetch,则可以使用XMLHttpRequest.responseURL-https://developer.mozilla.org/en-US/docs/Web/API/Response/url

IE不支持此功能。

答案 5 :(得分:0)

我还需要这样做,因为我在执行URL请求的for循环中。

由于通常在调用XMLHttpRequest对象的open方法之前就拥有URL请求,因此可以在xml对象上分配一个随机属性(在我的情况下是属性url):

var xml = new XMLHttpRequest();
xml.onreadystatechange = function() {
    if ( xml.readyState == 4) {
        console.log(xml.url); // equal to originalUrl
    }
};
xml.open("GET", originalUrl, true);
xml.url = originalUrl;
xml.send();