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请求和响应,将开发效率大大提高。