Nodejs request 如何获取到带 http status 和 http headers 的 rawResponse,类似 curl -i --raw 的输出?

发布于 1周前 作者 sinazl 来自 nodejs/Nestjs

Nodejs request 如何获取到带 http status 和 http headers 的 rawResponse,类似 curl -i --raw 的输出?

是否有办法返回如下格式的文本?

# curl -i --raw  https://httpbin.org/ip 
HTTP/1.1 200 OK
Connection: keep-alive
Server: meinheld/0.6.1
Date: Wed, 30 Aug 2017 16:36:59 GMT
Content-Type: application/json
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
X-Powered-By: Flask
X-Processed-Time: 0.000962972640991
Content-Length: 31
Via: 1.1 vegur

{
  "origin": "11.52.71.4"
}

目前是使用

var headers = '';
for (var i = 0; i < rsp.rawHeaders.length; i++) {
  headers += i % 2 ? (rsp.rawHeaders[i] + '\r\n') : (rsp.rawHeaders[i] + ': ');
}

console.log(‘HTTP/’ + rsp.httpVersion + ’ ’ + rsp.statusCode + ’ ’ + rsp.statusMessage

  • ‘\r\n’ + headers + ‘\r\n’ + rsp.body);

3 回复

pipe 到 buffer stream


我用下面 2 种方法获取到的都只有 response body,我用的方法和你说的不一样吗?还是我哪里用错了?

javascript<br>const fs = require('fs');<br>const request = require('request');<br><br>var bufs = [];<br>request('<a target="_blank" href="https://httpbin.org/get'" rel="nofollow noopener">https://httpbin.org/get'</a>)<br> .on('data', function(d) {<br> bufs.push(d);<br> }).on('end', function() {<br> console.log(Buffer.concat(bufs).toString());<br> });<br><br>request('<a target="_blank" href="https://httpbin.org/get').pipe(fs.createWriteStream('/tmp/response.raw'));" rel="nofollow noopener">https://httpbin.org/get').pipe(fs.createWriteStream('/tmp/response.raw'));</a><br><br>request('<a target="_blank" href="https://httpbin.org/get'" rel="nofollow noopener">https://httpbin.org/get'</a>, function(err, rsp, body) {<br> // 上面 2 种方法获取到的数据就是 body 的数据<br> console.log(body);<br>});<br>

在 Node.js 中,你可以使用 httphttps 模块,结合 requestaxios 库(如果你喜欢更高级的封装)来获取带有 HTTP 状态码和 HTTP 头部的原始响应(raw response),类似于 curl -i --raw 的输出。

以下是使用原生 https 模块的一个示例,展示如何获取带有 HTTP 状态码和头部的原始响应:

const https = require('https');

const options = {
  hostname: 'example.com',
  port: 443,
  path: '/',
  method: 'GET'
};

const req = https.request(options, (res) => {
  console.log(`STATUS: ${res.statusCode}`);
  console.log(`HEADERS: ${JSON.stringify(res.headers)}`);

  let rawData = '';
  res.setEncoding('utf8');
  res.on('data', (chunk) => { rawData += chunk; });
  res.on('end', () => {
    console.log(`RAW BODY: ${rawData}`);
  });
});

req.on('error', (e) => {
  console.error(`Problem with request: ${e.message}`);
});

req.end();

在这个示例中,我们发起一个 HTTPS GET 请求到 example.com,并在响应事件中打印出状态码和头部信息。同时,我们收集响应的主体数据,并在响应结束时打印出来。

如果你更喜欢使用 axios 库,可以通过设置 responseType: 'arraybuffer' 来获取原始响应数据,然后手动解析 HTTP 状态和头部。不过,axios 默认不提供像 curl -i --raw 那样直接输出原始响应的功能,因此你可能需要额外的处理。

回到顶部