Nodejs 判断HTTP请求的响应流header后再决定是否继续接收流

Nodejs 判断HTTP请求的响应流header后再决定是否继续接收流

获取网页的内容,但是想提高效率,所以想在响应流上只获取有用的。 例如:如果http的状态码返回404的话,如果http header的server为nginx的话,如果title为×××的话,等。 如果上述,我就不想获取整个响应流了,因为那样浪费流量和时间。

所以,有没有类似这样的js库(这里仅例http header):

function request(url, callback1, callback2) {
  ~由url发起request请求,获取响应流,stream
  ~从流中只读取http头header部分,先,

if (!callback1(header)) { ~如果这个回调返回false的话,就将流断开,结束处理 ~stream.close(); return; }

~继续获取整个http响应流,response callback2(response); }

以致于我可以这样:

request('http://foobar.org/a.html', function(header) {
  if (header.server == 'nginx') {
    return false;
  } else {
    return true;
  }
}, function(response) {
~处理response
});

PS:这编辑器的代码自动识别很让人无语,希望可以去掉自动


5 回复

Node.js 判断 HTTP 请求的响应流 Header 后再决定是否继续接收流

背景

在开发过程中,我们经常需要从网络请求中获取数据。为了提高效率和减少不必要的资源消耗,有时我们需要在接收到响应后根据某些条件来决定是否继续接收整个响应流。

目标

本示例将展示如何使用 Node.js 的 httphttps 模块来发起一个 HTTP 请求,并在接收到响应头后检查特定字段(如状态码、Server 头等),并根据这些信息决定是否继续接收响应体。

示例代码

首先,确保你已经安装了 Node.js 环境。然后,你可以创建一个新的 JavaScript 文件,例如 checkHeader.js,并在其中编写以下代码:

const http = require('http');

function request(url, headerCallback, bodyCallback) {
  // 发起 HTTP GET 请求
  const req = http.get(url, (res) => {
    // 初始化响应头对象
    let headers = {};

    // 监听 'data' 事件来读取响应头
    res.on('headers', () => {
      headers = res.headers;
    });

    // 监听 'end' 事件来完成对响应头的读取
    res.on('end', () => {
      // 调用 headerCallback 函数
      const shouldContinue = headerCallback(headers);

      if (!shouldContinue) {
        console.log('Response headers do not meet criteria. Aborting request.');
        return;
      }

      // 如果应该继续,则监听 'data' 和 'end' 事件来处理响应体
      res.setEncoding('utf8');
      let responseBody = '';
      res.on('data', (chunk) => {
        responseBody += chunk;
      });
      res.on('end', () => {
        bodyCallback(responseBody);
      });
    });
  });

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

// 定义回调函数
const headerCallback = (headers) => {
  // 检查状态码和 Server 头
  if (headers['status-code'] === '404' || headers.server === 'nginx') {
    return false;
  }
  return true;
};

const bodyCallback = (body) => {
  console.log('Response body:', body);
};

// 使用 request 函数
request('http://example.com/', headerCallback, bodyCallback);

解释

  1. 初始化请求:使用 http.get 方法发起一个 HTTP GET 请求。
  2. 读取响应头:通过监听 'headers' 事件来获取响应头,并将其存储在一个对象中。
  3. 检查条件:调用 headerCallback 回调函数,传入响应头对象。该回调函数应返回一个布尔值,指示是否应该继续处理响应体。
  4. 继续或终止:如果 headerCallback 返回 false,则终止请求。否则,继续监听 'data''end' 事件以处理响应体。
  5. 错误处理:通过监听 'error' 事件来处理可能发生的任何错误。

通过这种方式,我们可以有效地控制何时继续接收响应流,从而优化性能和资源使用。


首先你的代码的逻辑应该写成回调形式的, 如果是验证header头的话,你自己验证一下 比如

//写个验证的回调
cb1  = validate(req,res,cb2) {
   if OK{
     cb()
   }else{
     return
   }
}
//再写个cb2 做你想做的事情

request(url,cb1)

另外一点就是,用HEAD方法获得响应头,如果是你需要的再去GET。这样也不存在是否要继续接受流的问题了,多一步HEAD而已。

补充一下,markdown的编辑语法首页有,你可以看看。还有就是用request那个包挺好的,什么都给你封装好了。

用自带的http模块.on(‘data’)的时候大概第一次响应就有头信息了吧.

你可以使用 Node.js 的 httphttps 模块来实现这个需求。具体来说,可以通过监听 response 事件来读取 HTTP 响应的头部信息,然后根据头部信息决定是否继续接收响应流。

以下是一个简单的示例代码:

const http = require('http');

function request(url, headerCallback, dataCallback) {
  const parsedUrl = new URL(url);
  const options = {
    hostname: parsedUrl.hostname,
    port: parsedUrl.port,
    path: parsedUrl.pathname + parsedUrl.search,
    method: 'GET',
    headers: {}
  };

  const req = http.request(options, (res) => {
    // 获取响应头
    const header = res.headers;

    // 调用回调函数检查头部信息
    if (!headerCallback(header)) {
      // 如果回调函数返回 false,则关闭请求
      req.destroy();
      return;
    }

    // 如果头部信息满足条件,继续处理响应流
    let responseData = '';
    res.on('data', (chunk) => {
      responseData += chunk;
    });

    res.on('end', () => {
      dataCallback(responseData);
    });
  });

  req.on('error', (e) => {
    console.error(`问题发生:${e.message}`);
  });

  req.end();
}

// 使用示例
request(
  'http://example.com',
  (header) => {
    // 检查头部信息
    if (header['server'] === 'nginx' || header.status === '404') {
      return false;
    }
    return true;
  },
  (response) => {
    // 处理响应数据
    console.log(response);
  }
);

解释

  1. 初始化请求:首先,我们解析给定的 URL 并设置请求选项。
  2. 发送请求:通过 http.request 方法发送 GET 请求,并传入回调函数处理响应。
  3. 读取头部信息:在响应的 response 事件中,我们读取响应头信息并传递给用户定义的 headerCallback 函数。
  4. 根据头部信息决定是否继续:如果 headerCallback 返回 false,则调用 req.destroy() 来关闭请求。
  5. 处理响应数据:如果头部信息满足条件,则继续监听 dataend 事件来处理响应数据。

这样,你就可以根据 HTTP 响应头部信息决定是否继续接收响应流,从而节省带宽和时间。

回到顶部