如何从XMLHttpRequest中仅获取响应头部信息

4

是否可以仅从XMLHttpRequest获取响应头而不下载文件数据?


2
这个答案在4年前帮助了我解决问题,但似乎仍然没有客户端唯一的解决方案。如果你有,请分享出来,我会接受你的答案。 - Anton
3个回答

7
如果你希望向服务器发送指定的请求方法,那么你需要发送HTTP HEAD请求。详见HTTP规范。例如,比较使用curl -v -X GET https://github.comcurl -v -X HEAD https://github.com命令输出的结果。同时也可以参考JavaScript/Ajax里的HTTP HEAD请求

谢谢!那正是我需要的。 - Anton
1
因为用服务器端的答案回答客户端问题而被踩。 - John
1
我同意在这里展示如何从XHR响应对象中获取标头也会有所帮助,但对于OP的问题,我认为答案基本上是正确的。这里需要的HTTP操作是HEAD请求。但是我可能误解了问题。 - Stephen Ierodiaconou
2
@John - 不确定您为什么说这是服务器端解决方案,因为修复方法是根据您下面的答案发出 HEAD 请求。Stephan 只是用 curl 而不是浏览器代码来演示。但是 curl 和浏览器一样是客户端。 - broofa

1

使用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())
 }
}

这肯定会导致浏览器从服务器获取整个HTTP响应主体。这并没有回答OP的问题。它只是向他们展示了如何在JS中从响应对象中获取头数据。原始问题要求在不获取内容的情况下获取响应头。 - Stephen Ierodiaconou
抱歉,我不确定你的意思,你是在说正确答案是按照你的回答使用HTTP POST吗?还是读者应该理解你上面代码中的HTTP“方法”应该改为“head”,如果他们想向服务器指示他们不想要完整的响应体?在你的例子中,仅POST仍将返回一个响应体(假设服务器为给定的端点创建了一个响应体)。然而,HEAD请求的语义表明,服务器不会响应一个响应体(假设端点支持HEAD)。如果解释清楚,我很乐意取消投票。 - Stephen Ierodiaconou
我错过了头部被设置为后置。>__> - John
尝试为你的答案添加一些描述 - Muhammad Omer Aslam
@StephenIerodiaconou错了https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/getAllResponseHeaders,John是对的 - Brian Ogden

1

首先,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/readyStatehttps://developer.mozilla.org/en-US/docs/Web/HTTP/Methods

不对,我没有在响应中收到头信息。 - Ken Ingram

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