【问题标题】:How to get only response headers from XMLHttpRequest如何仅从 XMLHttpRequest 获取响应标头
【发布时间】:2014-03-10 10:29:02
【问题描述】:

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

【问题讨论】:

  • 这个答案帮助我解决了 4 年前的问题,但似乎仍然没有仅限客户端的解决方案。如果你有,请分享,我会接受你的回答。

标签: javascript http-headers xmlhttprequest


【解决方案1】:

如果您发出请求的服务器支持该方法,听起来您想要的是发出 HTTP HEAD 请求。请参阅HTTP spec

例如比较curl -v -X GET https://github.comcurl -v -X HEAD https://github.com的输出。

另见HTTP HEAD Request in Javascript/Ajax?

【讨论】:

  • 谢谢!这正是我所需要的。
  • 因使用服务器端答案回答客户端问题而被否决。 ?
  • 我同意在这里展示如何从 XHR 响应对象中获取标头也会有所帮助,但是对于 OPs 问题,我相信答案基本上是正确的。这里需要的 HTTP 操作是一个 HEAD 请求。但是我可能误解了这个问题。
  • @John - 不知道你为什么说这是一个服务器端解决方案,因为解决方法是根据你的回答发出 HEAD 请求,如下所示。 Stephan 只是用curl 而不是浏览器代码来证明这一点。但是 curl 既是客户端,又是浏览器。
【解决方案2】:

首先,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

【讨论】:

  • 不。我没有得到响应中的标题。
【解决方案3】:

使用 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 中的响应对象中获取标头数据。原始问题要求在不获取内容的情况下获取响应标头
  • 对不起,不确定您的意思,您是说正确的答案是根据您的答案使用 HTTP POST 吗?或者读者应该明白,如果他们想向服务器表明他们不想要完整的响应正文,那么上面代码中的 HTTP method 应该更改为 head?在您的示例中,仅 POSTing 仍将返回一个主体(假设服务器为给定端点创建一个主体)。然而,HEAD 请求的语义指示服务器不响应主体(假设端点支持 HEAD)。如果有解释,很高兴删除反对票。
  • 我错过了设置为帖子的头部。 >__>
  • 尝试在您的答案中添加一些描述
猜你喜欢
  • 2013-05-28
  • 1970-01-01
  • 2017-07-19
  • 2019-07-20
  • 1970-01-01
  • 2012-04-21
  • 2019-09-28
  • 1970-01-01
相关资源
最近更新 更多