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

# ライブラリがdeprecateされたので他のライブラリを使いましょう
https://github.com/request/request/issues/3142

node-fetchあたりとか。


# はじめに

## request-promiseとは？

* [request](https://github.com/request/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...
    });
```