如何用Node.js的https库获取Spring Boot 2响应的HTTPS头
如何用Node.js的https库获取响应头 & 排查获取不到的问题
首先来说第一个问题:怎么获取响应头
在https.request的回调函数里,传入的res(响应对象)自带headers属性,这是一个包含所有响应头的键值对对象。而且响应头是在响应最开始就返回的,你完全不需要等到data事件触发,在回调函数启动的第一时间就能访问到它。
给你修改下你的代码示例,演示怎么获取和返回响应头:
var options = { hostname: hostname, port: port, path: pathMethod, method: method, headers: { 'Content-Type': APPLICATION_JSON, 'Authorization': BEARER + localStorage.jwtToken }, rejectUnauthorized: false, agent: false, requestCert: false }; return new Promise(function(resolve, reject) { var req = https.request(options, function(res) { // 在这里直接就能拿到所有响应头 const responseHeaders = res.headers; console.log('完整响应头:', responseHeaders); // 获取特定头,注意Node会把所有头字段名转为小写 console.log('Content-Type:', responseHeaders['content-type']); // 如果是自定义头,比如X-Request-ID,也要用小写键名 console.log('自定义请求ID:', responseHeaders['x-request-id']); res.setEncoding(ENCODING_UTF8); res.on('data', function(result) { try { const obj = JSON.parse(result); resolve({ 'httpStatus': PAGE_STATUS_200, 'result': obj, 'headers': responseHeaders // 把响应头也纳入返回结果 }); } catch(error) { console.error(error); // 这里注意你原来的代码多嵌套了一层resolve,要修正 resolve({ 'httpStatus': PAGE_STATUS_500 }); } }); res.on('end', () => { console.log('No more data in response.'); }); }); req.on('error', function(err) { console.log(`problem with request: ${err.message}`); reject(err); }); if (postData) { req.write(postData); } req.end(); });
接下来解决第二个问题:为什么浏览器能看到的响应头,Node里拿不到?
这里有几个常见的排查方向:
字段名大小写问题:Node会自动把所有响应头的字段名转为小写,而浏览器开发者工具里显示的是原始大小写(比如
X-Custom-Header)。如果你在Node里用大写的字段名去访问(比如res.headers['X-Custom-Header']),就会拿不到值,必须用小写的res.headers['x-custom-header']。请求差异导致服务器返回不同头:你浏览器的请求和Node代码里的请求可能存在细节差异——比如
User-Agent、Cookie、额外的请求头不同,导致服务器返回的响应头不一样。你可以对比两者的请求头(比如Node里的options.headers和浏览器Network面板里的请求头),调整Node的请求头和浏览器保持一致再测试。错误的访问时机:如果你在
https.request的回调函数外部(比如请求发送后但响应还没回来时)去访问res.headers,自然拿不到值。一定要在回调函数内部,也就是res对象已经初始化完成后再访问。
内容的提问来源于stack exchange,提问作者alexis_dia
相关产品推荐
相关产品推荐

