JavaScript/Ajax中的HTTP HEAD请求?

63

是否可能仅使用JavaScript中的XMLHTTPRequest进行HTTP Head请求?

我的动机是为了节省带宽。

如果不行,是否可以伪造实现?


是的,请查看此链接... - coder
3个回答

106

很简单,只需使用HEAD方法,而不是GET或POST:

function UrlExists(url, callback)
{
    var http = new XMLHttpRequest();
    http.open('HEAD', url);
    http.onreadystatechange = function() {
        if (this.readyState == this.DONE) {
            callback(this.status != 404);
        }
    };
    http.send();
}

这只是一个简单的示例,展示如何使用HEAD方法。生产代码可能需要更精细的回调来处理不同的结果状态(成功、失败、超时),并且可能会使用不同的事件处理程序onloadonerrorontimeout而不是onreadystatechange)。


5
谢谢,有时框架的抽象化会隐藏底层的功能! - EoghanM
5
这个有没有跨浏览器支持?jQuery文档中提到:“注意:其他HTTP请求方法,例如PUT和DELETE也可以在这里使用,但并非所有浏览器都支持。” http://api.jquery.com/jQuery.ajax/ - Bobby Jack
6
同步请求会阻塞所有依赖于 JS 的任务(Douglas Crockford 曾经写过“同步编程是不尊重的,不应该在被人使用的应用程序中使用。”)。想想那些不知情地复制示例的人。因此,多年来这个答案的效果很差。更新内容既展示了如何使用异步请求,又明确指出了不应该逐字复制示例的事实。 - outis
30
我赞赏这个答案没有使用 jQuery。即使是最简单的 JS 问题在 SO 上也几乎总是被用 jQ 的方式回答。 - tbone
2
有没有可能,因为这只是一个HEAD请求,所以可以跨域? - user1637281
显示剩余5条评论

0
更现代的方法是使用Fetch API来替代XMLHttpRequest
例如(在async函数内部):
const url = "https://example.com";
const response = await fetch(url, { method: "HEAD" });
console.log(`Got status: ${response.status}`);


-6

一个XMLHTTPRequest对象应该具备以下特点

getAllResponseHeaders();
getResponseHeader("header-name")

在其中定义


3
Downvote:该回答似乎混淆了HTTP HEAD方法HTTP头部信息 - jcsahnwaldt Reinstate Monica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接