通常、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);
}
})
})