目的
Node-REDではHTTPで要求を受け、HTTPを出力する事が出来る。 これを使ってRDBに対してCRUD(Create, Read, Update, Delete)出来るWeb APIを作ってみる。
全件取得 Read
一番簡単な全件表示
最初にGets AllではアクセスするURLを指定する。 例えば/API/1/mytableとするなら
次にReadでSQLを書く
HTTPで返す前に他のサイトからアクセス出来るようにHeadersでHeaderを追加する
1 2 3 4 5 6 |
msg.headers = { "Access-Control-Allow-Origin":"*", "Access-Control-Allow-Method":"GET,POST,PUT,DELETE,OPTIONS", "Access-Control-Allow-Headers":"Origin, X-Requested-With, Content-Type, Accept" } return msg; |
1件取得 Read
IDを受けて対応するレコードを返す。
最初にGetでアクセスするID付きURLを指定する。 例えば/API/1/mytable/idとするなら
次にidを切り出す。(行6-8) ついでにHeaderを追加する。(行1-5)
8行目で1を掛けて文字列を念のために数字に変換している。
1 2 3 4 5 6 7 8 9 |
msg.headers = { "Access-Control-Allow-Origin":"*", "Access-Control-Allow-Method":"GET,POST,PUT,DELETE,OPTIONS", "Access-Control-Allow-Headers":"Origin, X-Requested-With, Content-Type, Accept" } var url = msg.req.url; var msgs = url.split("/"); msg.payload.ID=1*msgs[msgs.length-1]; return msg; |
切り出したidを使って抽出する
追加 Create
データを受けてRBDに入れるだけ。
最初にPostでアクセスするURLを指定する。 例えば/API/1/mytableとか。
HeadersはGetと同じなので省略。
変更 Update
IDを受けて対応するレコードを変更する。
最初にPutでアクセスするURLを指定する。 1件取得からMethodをPUTに変えるだけ。
IDは1件取得の時と全く同じ。 PUTされたデータはmsg.payloadに入って来るのでidだけを追加する。
Updateでは3つの引数をSQLに渡す。 この時は「,」で区切って渡す。
削除 Delete
IDを受けて対応するレコードを削除する。
最初にDeleteでアクセスするURLを指定する。 1件取得からMethodをDELETEに変えるだけ。
IDは1件取得の時と全く同じ。
idをSQLに渡して削除する。
まとめ
これはコードを書かずにAPIを作れるか!と思って一通り作ってみましたが色々と課題があります。
- Node-REDでエラーが起きてもHTTPには届かないのでタイムアウトを待つしかない。
- エラーが起きたらこっちの処理に移るような分岐が出来ない。
- エラーが起きた時のログが貧弱でほとんど何も分からない。 例えばテーブス名を間違えてもNode-REDのログには出ない。 Nodeのログを見るしかない。
フレームワークは制限がある分、楽が出来るのですがちょっと制限が多いのでIoT向けだけと考えた方が良さそうです。
[2015.11.09追記] Catch nodeを使うとエラーハンドリング出来ると教えて頂きました。 これについては別途書くつもりです。