Edited at

request-promiseを使ったHTTPクライアントを作る

More than 1 year has passed since last update.


はじめに


request-promiseとは?



  • requestをbluebirdでpromise化したもの

  • Requestプロジェクトに正式に入っている

  • browserifyでブラウザでも使える

  • cheerioなどのパーサーとも組み合わせやすい

  • promiseなのでrest-apiをモジュール化しやすい

  • ベースがrequestなのでrequestの最新版の機能がそのまま使える

  • ”NODE_DEBUG=request node script.js” でリクエスト内容のデバッグができる


install

npm i request-promise


USAGE


GETの簡単な例

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

rp('http://www.google.com')
.then(function (htmlString) {
// Process html...
})
.catch(function (err) {
// Crawling failed...
});


ステータスコード

404エラーなどのハンドリング

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

rp('http://www.google.com')
.then(function (htmlString) {
// Process html...
})
.catch(function (err) {
switch(err.statusCode){
case 404:
// NOT FOUND Process
break;
default:
// Other Error Process
break;
}
});


パーサーを使ってモジュール化する例


jsonの場合


  • optionsに{json : true}でもJSONパースできるがこの場合例外キャッチできないのでtransformを使ったほうが安全(パースできないとテキストとして解釈する?)

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

var jsonget = function(uri){
var options = {
uri: uri,
transform2xxOnly: true, // ステータスコード200以外のときにHTMLページを帰す場合はtrueにする
transform: function (body) {
return JSON.parse(body);
},
};
return rp(options);
}
jsonget('https://raw.githubusercontent.com/nodejs/node/0928584444ac6edf1ead0b93c9d05b1124183702/deps/npm/package.json')
.then(function (json) {
// Process json...
})
.catch(function (err) {
// Crawling failed...
});


yamlの場合

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

var yaml = require('js-yaml');

var yamlget = function(uri){
var options = {
uri: uri,
                transform2xxOnly: true, // ステータスコード200以外のときにHTMLページを帰す場合はtrueにする
transform: function (body) {
return yaml.safeLoad(body);
},
};
return rp(options);
}
yamlget('https://raw.githubusercontent.com/ansible/ansible-examples/master/lamp_simple/site.yml')
.then(function (yaml) {
// Process yaml...
})
.catch(function (err) {
// Crawling failed...
});


GETオプションを指定する

var options = {

uri: "https://api.github.com/user/repos", // URL
method: "GET",
timeout: 30 * 1000, // タイムアウト指定しないと帰ってこない場合がある
qs: { // query string
access_token: 'xxxxx xxxxx' // -> uri + '?access_token=xxxxx%20xxxxx'
},
headers: { // header
'User-Agent': 'Request-Promise'
},
}


POSTの簡単な例


HTML FORMにPOSTする

var options = {

method: 'POST',
uri: 'http://posttestserver.com/post.php',
timeout: 30 * 1000, // タイムアウト指定しないと帰ってこない場合がある
form: {
name: 'hoge hogeo', // urlencodeされる
address: 'hoge city',
},
headers: {
/* 'content-type': 'application/x-www-form-urlencoded' */ // ヘッダはデフォルトでapplication/x-www-form-urlencodedが適用されるのでセットしなくてもよい
}
};

rp(options)
.then(function (body) {
// POST succeeded...
})
.catch(function (err) {
// POST failed...
});

※戻りがJSONの場合はtransformにJSON.parse処理を入れる


JSONでPOSTする

var options = {

method: 'POST',
uri: 'http://posttestserver.com/post.php',
json: {
name: 'hoge hogemi',
address: 'secret',
},
};

rp(options)
.then(function (parsedBody) {
// 戻りも自動でJSONパースされる
// POST succeeded...
})
.catch(function (err) {
// POST failed...
});