Help us understand the problem. What is going on with this article?

2分で実装!Node-REDで認証付きREST API呼び出し

More than 3 years have passed since last update.

 前回、Node-REDのREST APIの呼び出し方の記事を書きました。前回用いたAPIは単純に呼び出せますが、最近のAPIは認証情報を付けて利用するものも増えてきました。URLにパラメータとして認証情報を付けて利用するAPIは、URLに記載するのみで良いため簡単ですが、HTTPヘッダに認証情報を入れる必要があるAPIをNode-REDから問合せるには、少し工夫が必要です。今回は、Microsoft Cognitive ServicesのWeb Language Model APIを例として用いて説明します。

Node-REDとは

 Node-REDは、機能毎に用意されたノードという処理単位をマウスで繋ぐ操作で、簡単にアプリケーションを作成できる開発環境です。当初はIoT向けに開発されましたが、現在はウェブアプリケーション開発等、幅広い用途で利用されています。オープンソースのソフトウェアのため、AWSAzureBluemixなど、クラウドに依存せず利用できます。また、ラズベリーパイに標準でインストールされているソフトウェアでもあるため、特にクラウドとIoT端末の連携に優れています。

今回連携させるAPI (Web Language Model API)

 Cognitive Servicesは、Microsoftが提供しているコグニティブAPIの総称です。画像認識、音声認識などの機能をクラウド経由で簡単に利用することができます。そのため、開発者は高度な知識や大規模なハードウェアがなくとも、アイデアさえあれば高度な人工知能アプリケーションを簡単に開発することができます。
 今回、連携させるWeb Language Model APIは、Cognitive Servicesの1つであり、検索エンジンBingで収集したペタバイト級のコーパス活用したAPIです。文字列の出現確率を返すなど地味なAPIですが、自然言語処理屋さんなら驚異的なデータ量から求めた結果を参照できるAPIであることが、すぐ分かる思います。今まで何ヵ月もかけてウェブのデータをクロールし、数十台のHadoopクラスタを用いてても求めることの出来なかった大規模なデータをAPIから簡単に参照できるのです。本APIを利用することで、開発者は時間のかかる無駄な作業がなくなり、素早く価値を出すアプリケーション開発に集中できるようになります。

Node-REDで認証付きREST APIの呼び出し(GET編)

 GETでREST APIを参照する例として、List Available Modelsというモデル一覧を取得するAPIを叩いてみます。ドキュメントには、ヘッダに"Ocp-Apim-Subscription-Key: <サブスクリプションキー>"を設定する様に説明されています。curlコマンドで用いるのであれば、ドキュメントに載っているとおり-Hオプションに指定します。

curl.png

 Node-REDで同様の問合せをするには、http requestノードの前にtemplateノードを配置します。このtemplateノードの中に認証情報を記述します。

flow_get.png

 templateノードはSet propertyの値を"msg.payload"から"msg.headers.Ocp-Apim-Subscription-Key"に変更します。本文にサブスクリプションキー(認証情報)を貼り付けます。

template_key.png

 http requestノードには、List Available ModelsのURLであるhttps://api.projectoxford.ai/text/weblm/v1.0/modelsを登録します。

http_request_get.png

 あとはtemplateノードの前に処理をキックするinjectノード、http requestノードの後ろに処理結果を表示するdebugノードを配置すれば完成です。injectノードの左がのボタンをクリックすると、右側のデバッグ画面にREST APIの実行結果が出力されます。下の実行結果のとおり、様々なモデルが用意されていることが分かりますね。

debug_get.png

Node-REDで認証付きREST APIの呼び出し(POST編)

 List Available Modelsは、GETによりREST APIを叩きましたが、他のCalculate Joint ProbabilityなどのAPIは、POSTしか対応していません。このAPIをNode-REDから叩くには、さらにPOSTするデータを格納したtemplateノードの追加が必要です。

flow_post.png

 http requestノードではMethodの値をPOSTへ変更し、Calculate Joint ProbabilityのURLであるhttps://api.projectoxford.ai/text/weblm/v1.0/calculateJointProbability?model=bodyを登録します。modelは一番データサイズが大きそうな"body"を指定しました。

http_request_post.png

 templateノードのSet propertyの値はmsg.payloadのまま変更せずに、本文にPOSTするデータを記述します。今回は、"this"、"is"、"this is"の単語の出現確率を求めます。

template_data.png

 完成したフローにて、Injectノードのボタンをクリックすると、デバッグ画面に出現確率が出力されます。出現確率は対数値で返ってきますので、マイナスとなり大小が少し分かりにくいですが、値が大きい単語ほど出現確率が高く、値が小さいほど出現確率が低くなります。言い換えると、値が大きいものほどウェブ上でよく現れる単語で、値が小さいほど珍しい単語となります。最も文章に現れそうな"is"が最も値が大きく、次に小さいものが"this"になっています。"this"の後ろにはbe動詞以外に名詞が来るケースもあり、"this"の後ろは必ず"is"にならないため、"this is"の確率はこの3つのうちで最も小さな値となります。

debug_post.png

最後に

 今回、Node-REDを用いた認証付きREST APIの呼び出し方法を説明しました。せっかくCognitive ServicesのAPIの呼び出し方が分かったので、次回はWeb Language Model APIのコーパスの有用さを伝えるために、本APIを用いた簡易質問応答システムの作り方を紹介しようと思います。

ソースコード

 今回、紹介した処理のソースコードを共有します。Node-REDでは、開発環境の右上メニュー->Import->Clipboardからソースコードをインポートすることができます。認証情報は、Cognitive Servicesのページから取得したものを貼り付けてください。

GET編

[{"id":"b5ffed5d.9a2b1","type":"inject","z":"e9429a8b.d8cf18","name":"処理実行","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"x":148,"y":95,"wires":[["b11e9b39.ab3b58"]]},{"id":"b11e9b39.ab3b58","type":"template","z":"e9429a8b.d8cf18","name":"認証情報設定","field":"headers.Ocp-Apim-Subscription-Key","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"<サブスクリプションキーを貼り付ける>","x":170,"y":157,"wires":[["c6ec4975.0696e8"]]},{"id":"c6ec4975.0696e8","type":"http request","z":"e9429a8b.d8cf18","name":"REST API問合せ","method":"GET","ret":"txt","url":"https://api.projectoxford.ai/text/weblm/v1.0/models","tls":"","x":368.9999694824219,"y":157,"wires":[["825e80c.c03f08"]]},{"id":"825e80c.c03f08","type":"debug","z":"e9429a8b.d8cf18","name":"結果表示","active":true,"console":"false","complete":"payload","x":547.9999694824219,"y":157,"wires":[]}]

POST編

[{"id":"ab581b0c.297378","type":"inject","z":"e9429a8b.d8cf18","name":"処理実行","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"x":134,"y":345,"wires":[["a0c5d30a.2d8f9"]]},{"id":"35c2211c.64f62e","type":"template","z":"e9429a8b.d8cf18","name":"認証情報設定","field":"headers.Ocp-Apim-Subscription-Key","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"<サブスクリプションキーを貼り付ける>","x":167,"y":420,"wires":[["3ad08f94.d2282"]]},{"id":"3ad08f94.d2282","type":"http request","z":"e9429a8b.d8cf18","name":"REST API問合せ","method":"POST","ret":"txt","url":"https://api.projectoxford.ai/text/weblm/v1.0/calculateJointProbability?model=body","tls":"","x":365.99998474121094,"y":420,"wires":[["60e2b335.e604dc"]]},{"id":"60e2b335.e604dc","type":"debug","z":"e9429a8b.d8cf18","name":"結果表示","active":true,"console":"false","complete":"payload","x":543.9999847412109,"y":420,"wires":[]},{"id":"a0c5d30a.2d8f9","type":"template","z":"e9429a8b.d8cf18","name":"POSTデータ設定","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"{\n\t\"queries\":\n\t[\n\t\t\"this\",\n\t\t\"is\",\n\t\t\"this is\"\n\t]\n}","x":302,"y":345,"wires":[["35c2211c.64f62e"]]}]
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away