You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue.js中如何通过vue-resource获取请求的HTTP协议版本?

嘿,这个问题我刚好研究过,来给你拆解下可行的方案~

首先得明确一个核心点:HTTP协议版本信息并不在响应头里,它属于请求连接的元数据,所以你用response.headers.get()肯定拿不到——这也是为啥开发者工具里要在「请求」标签页看它的原因。

接下来分两种可行的思路,结合vue-resource来实现:


1. 利用浏览器Performance API(兼容性更稳妥)

浏览器的Performance API可以获取到每个资源请求的详细连接信息,包括协议版本。我们可以借助vue-resource的拦截器,在请求完成后匹配对应的性能条目:

// 注册vue-resource响应拦截器
Vue.http.interceptors.push((request, next) => {
  // 等待请求完成后处理
  next((response) => {
    // 通过请求URL匹配对应的性能条目
    const resourceEntries = performance.getEntriesByName(request.url);
    if (resourceEntries.length > 0) {
      // nextHopProtocol会返回类似"h2"(HTTP/2)、"http/1.1"这样的值
      const protocolVersion = resourceEntries[0].nextHopProtocol;
      console.log(`目标服务器使用的HTTP协议版本: ${protocolVersion}`);
      // 你也可以把这个值挂载到response对象上,方便后续业务逻辑使用
      response.$protocolVersion = protocolVersion;
    } else {
      // 兼容找不到条目的情况,默认标记为HTTP/1.x
      console.log('无法获取协议版本,默认视为HTTP/1.x');
    }
    return response;
  });
});

注意事项:

  • 这个方法需要你的请求是同源,或者CORS请求携带了Timing-Allow-Origin响应头(你已经用代理绕过CORS,应该满足条件);
  • 兼容性很好,Chrome、Firefox、Safari 11+都支持Performance API的相关方法。

2. 借助Fetch API的非标准属性(更直接,但兼容性稍弱)

你提到的nextHopProtocol其实是Fetch API中Response对象的候选标准属性,目前Chrome和Firefox都支持,Safari从15.4开始支持。如果你的vue-resource配置为使用Fetch底层(部分版本支持通过配置开启),可以直接拿到:

Vue.http.get('/your-api-path', {
  // 开启Fetch模式(不同vue-resource版本可能配置方式不同,需确认文档)
  emulateHTTP: false,
  fetch: true
}).then(response => {
  // 注意:这里的response如果是原生Fetch的Response对象,就可以直接取
  const protocol = response.nextHopProtocol;
  console.log(`HTTP协议版本: ${protocol}`);
});

如果你的vue-resource版本不支持直接切换到Fetch,也可以考虑直接使用原生Fetch发起请求,绕开框架封装,直接获取这个属性——毕竟你也提到这个问题和Vue本身无关。


最后补充兼容性说明

  • nextHopProtocol还不是正式的W3C标准,属于候选推荐阶段,所以老版本浏览器(比如Safari <15.4)会不支持;
  • 如果需要兼容全量浏览器,建议优先用Performance API的方案,拿不到时降级处理即可。

内容的提问来源于stack exchange,提问作者Federico Moretti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:06:58