【发布时间】:2014-03-10 10:29:02
【问题描述】:
是否可以只从XMLHttpRequest 获取响应头而不下载文件数据?
【问题讨论】:
-
这个答案帮助我解决了 4 年前的问题,但似乎仍然没有仅限客户端的解决方案。如果你有,请分享,我会接受你的回答。
标签: javascript http-headers xmlhttprequest
是否可以只从XMLHttpRequest 获取响应头而不下载文件数据?
【问题讨论】:
标签: javascript http-headers xmlhttprequest
如果您发出请求的服务器支持该方法,听起来您想要的是发出 HTTP HEAD 请求。请参阅HTTP spec。
例如比较curl -v -X GET https://github.com和curl -v -X HEAD https://github.com的输出。
【讨论】:
curl 而不是浏览器代码来证明这一点。但是 curl 既是客户端,又是浏览器。
首先,John 的回答解决了这个问题,但由于没有足够的解释而被否决。
所以这里有一个解释以及你可以添加的额外位的修复。
客户端解决方案如下(我以状态码为例):
function checkStatus(url) {
return new Promise((resolve, reject) => {
const request = new XMLHttpRequest();
request.open('HEAD', url, true)
request.onreadystatechange = () => {
if (request.readyState >= 2) {
resolve(request.status)
request.abort()
}
}
request.onerror = (e) => {
reject(e)
}
request.send()
})
}
这有两个原因。
首先,我们将HEAD 作为方法传入,而不是GET,这本身就足够了,但如果你想做更多,你可以转到第二个原因。
这行得通的第二个原因是readyState 状态。
0 = UNSENT
1 = OPENED
2 = HEADERS_RECEIVED
3 = LOADING
4 = DONE
在2 状态,标题已准备好查看。这意味着您可以返回您需要的任何内容和/或中止请求的其余部分,以防止下载任何进一步的数据。
值得注意的是,您也可以在阶段3 使用request.onprogress 执行此操作。
有关详细信息,请参阅 https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/readyState 和 https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods。
【讨论】:
使用 JavaScript(如问题中所述)只需通过 AJAX 使用 head 请求:
var xhr = new XMLHttpRequest();
var method = 'head';
var url = 'https://www.example.com/';
xhr.open(method,url,true);
xhr.send(null);
xhr.onreadystatechange = function()
{
if (xhr.readyState === 4)
{
console.log(xhr.getAllResponseHeaders())
}
}
【讨论】:
method 应该更改为 head?在您的示例中,仅 POSTing 仍将返回一个主体(假设服务器为给定端点创建一个主体)。然而,HEAD 请求的语义指示服务器不响应主体(假设端点支持 HEAD)。如果有解释,很高兴删除反对票。