使用request-promise-native的一点心得

关于

最近写爬虫时候,因为喜欢nodejs现在原生支持的async和await语法,所以需要对request进行一点改造,后来发现,自己写的,总是有些东西没处理好,通过查找发现了request-promise-native库。

这个库的简介就是:

This package is similar to request-promise but uses native ES6 promises.

Please refer to the request-promise documentation. Everything applies to request-promise-native except the following:

  • Instead of using Bluebird promises this library uses native ES6 promises.
  • Mind that native ES6 promises have fewer features than Bluebird promises do. In particular, the .finally(...) method is not available.

很合我的需求。

实际使用中,也碰到了一些坑,查找发现用户似乎不是很多,讨论的比较少,国内中文的更少了,于是记录下来这篇文字。

安装

安装很简单,两句话

1
2
npm install --save request
npm install --save request-promise-native

使用

安装说明,这个使用和request-promise是一样的,虽然我没有用过那个库。大概写一下我的使用方法

引用:

1
var rp = require('request-promise');

Get网页:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
let response = await rp('http://www.google.com')
或者
var options = {
uri: 'http://www.google.com',
};
rp(options)
.then(function (body) {
// body response.body
})
.catch(function (err) {
// err处理
});

Post网页:

1
2
3
4
5
let response = await rp.post({
url: loginUrl,
headers: loginHeaders,
form: formdata,
});

或者

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var options = {
method: 'POST',
uri: loginUrl,
form: {
'next': '/', 'u': username, 'p': pwd, 'once': once
},
headers: {
/* 'content-type': 'application/x-www-form-urlencoded' */ // Is set automatically
}
};
rp(options)
.then(function (body) {
// POST succeeded...
})
.catch(function (err) {
// POST failed...
});

处理Promise的方式:

这里写一下,可以使用.then()的方式处理:

1
2
3
4
5
6
7
rp(options)
.then(function (body) {
// body response.body
})
.catch(function (err) {
// err处理
});

也可以返回一个Promise对象,集合上await,方便啊:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
const loginHeaders = {
'User-Agent': UA,
Host: 'www.v2ex.com',
Origin: 'https://www.v2ex.com',
Referer: 'https://www.v2ex.com/signin',
};
const optionsLogin = {
url: 'http://www.v2ex.com/signin',
headers: loginHeaders,
};
async function login() {
...
let response = await request(optionsLogin);
...
}

这里的response 是 request回来的body部分。

一些特定的使用

我再用时,因为用习惯了request,习惯性还是喜欢还原成request的方式,所以特意使用了两个特殊的参数

1
2
3
4
5
6
7
8
const rp = require('request-promise-native');
const request = rp.defaults({
resolveWithFullResponse: true,
simple: false,
transform(body, response, resolveWithFullResponse) {
return iconv.decode(body, encoding);
},
});

resolveWithFullResponse: 使用了这个,那么返回的就不仅仅是response.body ,而是整个response。这个在判断302跳转等时候比较有用

simple:默认情况下,出现了301,302等等,只要不是2XX,就会报异常的,但是使用了这个,就不会了,需要自己进行处理了。

transform: 这个是对返回结果进行处理。我这里的处理就是制定了encoding了,这样只要传入gb2312,就可以处理gb2312编码的网页。还是很方便的。

处理error

这个 既然使用了 await 要不怪怪的 try catch

要不使用 await-to-js 也不错。

最后

祝所有看到本篇的人 谁赞谁皮肤好,恩,其实根本没开通点赞, 哈哈哈哈 ↖(^ ω ^)↗

坚持原创技术分享,您的支持将鼓励我继续创作!