Node.js
Bluemix
Watson
ibmcloud

IBM Cloud上のNode.jsでライブラリを使わずにWatson APIを呼び出す方法

通常、IBM Cloud(旧Bluemix)上のNode.jsのアプリからWatson APIを呼び出す場合、Watson APIのライブラリを使うのですが、わけあって、直接REST API Callをしたいことがあり、その時の話のメモとしての雛形コードを記載します。Language Tanslator APIが対象となっていますが、同じ考え方で他のAPI Callもできるはずです。

前提

  • Node.jsはローカルでもテストできるよう、ローカルとIBM Cloudどちらでも動くものとします。
  • ローカル環境では、通常のサンプルアプリのお作法通り、.envファイルにusername、passwordの記載を行うものとします。
  • IBM Cloud環境では、APIサービスはアプリケーションにバインドされており、VCAP_SERVICES環境変数経由で、username、passwordを取得できるものとします。

サンプルコード

  • 上記の条件を実装するための部分のみ抽出した雛形コードです。通常のお作法によるNode.jsコードはこの外側に必要です。
  • エラー処理は省略しています。
// .envファイルの読み込み
require('dotenv').load({silent: true});

// アプリ(ブラウザ側)から /api/translateで呼ばれた場合の処理
app.post('/api/translate',  function(req, res, next) {
    // パスワードエンコードに必要
    const bufferFrom = require('buffer-from');

    // リクエストを直接出すのに必要
    const request = require('request');

    // username一時保存用
    var username;

    // password一時保存用
    var password;

    // ローカル環境で.envファイルからusername、password取得
    if (process.env['LANGUAGE_TRANSLATOR_USERNAME']) {
        username = process.env['LANGUAGE_TRANSLATOR_USERNAME']
    }
    if (process.env['LANGUAGE_TRANSLATOR_PASSWORD']){
        password = process.env['LANGUAGE_TRANSLATOR_PASSWORD'];
    }

    // IBM Cloud環境上でusername、password取得 (サービスがバインドされている前提)
    if (process.env.VCAP_SERVICES)
    {
        var env = JSON.parse(process.env.VCAP_SERVICES);
        var vcap = env.language_translator;
        username = vcap[0].credentials.username;
        password = vcap[0].credentials.password;
     }

    // リクエストヘッダの生成
    // username, passwordはBase64でエンコードする
    var headers = {
        Authorization: 'Basic ' + bufferFrom(username + ':' + password).toString('base64'),
        'Content-Type':'application/json'
    }

    // リクエスト時のオプションデータ作成
    var options = {
        url: 'https://gateway.watsonplatform.net/language-translator/api/v2/translate',
        method: 'POST',
        headers: headers,
        json: true,
        body: {
            text: req.body.text,
            model_id: req.body.model_id
        }
    }

    // リクエスト実行
    request(options, function (error, response, body) {
        if ( error ) {
            console.log(error);
            return next(error);
        } else {
            // 正常終了時
            res.json(body);
        }
    })
})

参考リンク Bluemix上のWatsonアプリをローカル環境で開発・デバッグする際のTips