您的位置:

SuperAgent详解:一个强大的Node.js HTTP客户端

SuperAgent是一个轻量级的HTTP客户端,使用Node.js内置的HTTP模块,可以在客户端或服务器端使用,支持promise,链式写法,可将请求结果自定义解析为JSON格式,支持Cookie,动态URL参数等,是一个非常全能的HTTP客户端工具。

一、安装和使用

SuperAgent是一个npm包,可以使用npm命令进行安装。


npm install superagent --save

安装后,在项目中引入SuperAgent。


const request = require('superagent');

使用SuperAgent发送一个GET请求,需要输入请求的URL,并在end回调函数中处理响应结果。


request.get('/api/user')
  .end((err, res) => {
    if (err) throw err;
    console.log(res.body);
  });

二、发送HTTP请求

1. 基本用法

SuperAgent支持HTTP/HTTPS协议,支持GET/POST/PUT/DELETE等请求方法,可以通过chainable语法构造请求,如下所示:


request
  .post('/api/user')
  .send({ name: 'John', email: 'john@example.com' })
  .set('X-API-Key', 'foobar')
  .set('Accept', 'application/json')
  .end((err, res) => {
    if (err) throw err;
    console.log(res.body);
  });

请求中采用链式调用,用.send()设置请求体,用.set()设置请求头,用.end()结束请求,用于回调响应内容。

2. 设置请求头和请求体

在实际应用中,有时需要在请求中设置请求头和请求体,SuperAgent提供了.set()和.send()方法分别设置请求头和请求体,如下所示:


request.post('/api/user')
  .set('Content-Type', 'application/json')
  .set('X-API-Key', 'foobar')
  .send({ name: 'John', email: 'john@example.com' })
  .end((err, res) => {
    if (err) throw err;
    console.log(res.body);
  });

以上代码,通过.set()方法设置了Content-Type和X-API-Key两个请求头,通过.send()方法设置请求体。

3. 发送表单数据

发送表单数据时,需要设置Content-Type为application/x-www-form-urlencoded,以便服务端能够正确解析请求。SuperAgent提供了.type()方法用于设置Content-Type,并通过.send()方法发送表单数据,如下所示:


request.post('/api/user')
  .type('form')
  .send({ name: 'John', email: 'john@example.com' })
  .end((err, res) => {
    if (err) throw err;
    console.log(res.body);
  });

4. 发送文件

发送文件时需要通过.formData()方法来添加文件,如下所示:


request.post('/api/upload')
  .attach('avatar', '/path/to/avatar.jpg')
  .end((err, res) => {
    if (err) throw err;
    console.log(res.body);
  });

以上代码使用SuperAgent发送一个POST请求,添加了一个名为avatar,路径为/path/to/avatar.jpg的文件,使用.attach()方法添加文件。

三、处理响应数据

SuperAgent支持promise,支持链式调用,通过.then()方法处理响应结果,也可以在.end()回调函数中处理,如下所示:


request.get('/api/user')
  .then(res => {
    console.log(res.body);
  })
  .catch(err => {
    console.error(err);
  });

以上代码使用SuperAgent发送一个GET请求,处理响应结果并通过.then()方法输出响应内容,通过.catch()方法捕获错误信息。

1. 解析响应数据为JSON/XML格式

SuperAgent默认将响应结果解析为JSON格式,如果响应数据不是JSON格式需要手动指定解析格式,如下所示:


request.get('/api/data.xml')
  .set('Accept', 'application/xml')
  .buffer(true)
  .parse((res, callback) => {
    res.text = '';
    res.setEncoding('utf8');
    res.on('data', chunk => {
      res.text += chunk;
    });
    res.on('end', () => {
      callback(null, res.text);
    });
  })
  .end((err, res) => {
    if (err) throw err;
    console.log(res.text);
  });

以上代码设置了Accept请求头,表示需要响应数据为XML格式,并使用.parse()方法自定义响应的解析逻辑。

2. Cookies

在处理HTTP请求时,SuperAgent能够处理客户端的Cookies和服务端的Cookies,通过Cookies实现状态保持。可以使用.set()方法设置请求头中的Cookie字段,如下所示:


request.get('/api/user')
  .set('Cookie', 'sessionid=123456')
  .end((err, res) => {
    if (err) throw err;
    console.log(res.body);
  });

以上代码使用SuperAgent发送一个GET请求,设置了请求头中的Cookie字段。

3. 响应拦截器

SuperAgent支持响应拦截器,可以在响应结果返回后在.then()方法中执行,如下所示:


request.get('/api/user')
  .then(res => {
    console.log(res.body);
    return res.body.id;
  })
  .then(id => {
    return request.post('/api/user/' + id)
      .send({ status: 'online' });
  })
  .then(res => {
    console.log(res.body);
  })
  .catch(err => {
    console.error(err);
  });

以上代码发送一个GET请求,拿到响应结果后,再通过.then()方法处理响应内容并返回id,然后拼接请求URL发送一个POST请求,同时传递status参数。

四、超时处理

在实际应用中,保持网络正常运行是非常困难的。SuperAgent提供了.timeout()方法来设置请求超时时间,可以在调用的地方设置超时时间(单位:毫秒),如下所示:


request.get('/api/user')
  .timeout(5000)
  .end((err, res) => {
    if (err && err.timeout) {
      console.error('请求超时');
    } else if (err) {
      console.error(err);
    } else {
      console.log(res.body);
    }
  });

以上代码设置了请求超时时间为5秒,如果超时了,则抛出超时错误。

五、总结

SuperAgent是一个非常强大的HTTP客户端,支持Node.js内置的HTTP模块,支持promise,链式写法,可自定义解析结果为JSON格式,支持Cookie,动态URL参数等功能。在实际应用中,使用SuperAgent可以轻松处理HTTP请求和响应,将开发效率大大提高。