有没有办法从xhr对象中提取请求网址? 我可以通过channel属性看到firebug中的url,但是你无法使用javascript查询它。
答案 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();