ブロックを積みながら(69) Node-RED、HTTP in / outノードその2

Joseph Halfmoon

前回 HTTP in/outノードを試用してみましたがinとoutの間に何も処理を挟まなかったのでそれらしくありませんでした。今回はtemplateノード一つ挟んで、HTTPらしくGETして、POSTして、とやって見たいと思います。まあ、Node-REDで普通のWebサイトを作る気はないのですが、やれば出来る、と。

※「ブロックを積みながら」投稿順 index はこちら

今回作成のフローを冒頭のアイキャッチ画像に掲げました。フローは3つ、まったく同じ3ステップ構造です。

    1. HTTP in ノードでurl へのHTTPリクエストを受け付け
    2. Templateノードで、上記レスポンスに対するHTMLファイルを生成し
    3. HTTP out ノードで生成したレスポンスを返す

上記3ステップのうち、一番手間がかかるは今回の実験ターゲットではないTemplateノードで、実際にHTML文を作らねばならないためです。HTTP inノードはURLの設定と、アクセスのメソッドがGETなのかPOSTなのかを指定する程度、HTTP out ノードについては、ともかくレスポンスを返すだけ、設定はデフォルトのままです。

3つのフローの動作は以下のようです。

    • 第1のフローはstartPage とて、該当 url へリクエストがあると、選択肢を表示するためのページを返します。
    • 第2のフローはselectPageとて、上記の選択肢ページの「選択肢」の一つをクリックすると、それに反応してデータをPOSTするための第2のページを返します。
    • 第3のフローpostPageとて、上記のPOSTページに入力したデータを受け取って、受け取ったレスポンスを示す第3のページを返します。

第1のページのURLへブラウザからアクセスするとこんな画面が表示されます。

startPage

上記の Select page 1のリンクをクリックすると現れる第2のページが以下です。

postPage

上記の入力行にテキトーに入力し、SUBMITしてみると反ってくるレスポンスが以下です。

postResponse

本当は裏でデータベースでも動かすところだけですが、今回はお返事するだけ。

第1のフローの設定

第1のフローはURLにアクセスしたときにページを返すだけ、パラメータなどないので単純GET、実体はURLを指定しているだけです。こんな感じ。

reqStart

上記にアクセスがあったときに生成しているHTML文は以下です。何の加工もない「平文」です。これを送り返すだけ。

temp1

第2のフローの設定

第2のフローもGETメソッドですが、パラメータを伴ってます。2つの選択肢がselというkeyに載ってやってくるはず。

reqPost

引き続くtemplateノードは、今回は Mustacheテンプレート形式です。msg.payload内にJSONオブジェクトとして搭載されているGETのパラメータ、

payload.sel

というキーで取り出し、マスタッシュ{{}} の中に挿入してレスポンスするHTMLを作ってます。こんな感じ。

temp2

第3のフローの設定

第3のフローのHTTP inノードは、実際にデータを受け取るのでPOSTメソッド指定です。

reqPostRes

POSTにしたからといってNode-REDのフローの中では何ほどの違いもありませぬ。結局データは msg.payloadの中のJSONオブジェクトに載っています。入力フィールドに入力した文字列データは、指定したNAME=”textField”をキーとするプロパティに載ってます。

本来はこれを読み取って何か処理をするわけですが、今回は以下のHTML文に埋め込んで「受け付けたよ~」と無意味なお返事をするだけです。

temp3

なんか、こんな感じでズルズル書いていけばいくらでも書けそうですが、別にWebサイトを作りたいというわけではありません。HTTPも使えそうな気がしてきたので(気のせいかも)、先に進みたいと思います。

ブロックを積みながら(69) Node-RED、HTTP in / outノードその1 へ戻る

ブロックを積みながら(70) Node-RED、rpi-gpio out ノード へ進む