APEX超入門チュートリアル Part 3 - センサーデバイスからデータを受け取るIoTバックエンドを構築する


Raspberry Piなどの各種センサーデバイスから送信される情報を受け取るIoTバックエンドを構築します。今回は土壌湿度情報を保存すると想定して進めていきます。

## 表を作成する

HATAKE_LOGという名前の表を作成します。今回必要となる表はこれだけです。この表にセンサーデバイスから送信される情報を順次保存していきます。

SQLワークショップ > オブジェクト・ブラウザを開き、画面右上の＋プルダウンメニューから表を選択します。
![スクリーンショット_2016-06-02_9_04_37.png](https://qiita-image-store.s3.amazonaws.com/0/26079/404fd35b-1ef0-21c5-f1fe-05786f9fa137.png "スクリーンショット_2016-06-02_9_04_37.png")

![スクリーンショット_2016-06-02_9_06_26.png](https://qiita-image-store.s3.amazonaws.com/0/26079/3a787313-bc3d-655e-3203-cf13aef3e5e3.png "スクリーンショット_2016-06-02_9_06_26.png")

![スクリーンショット 2016-06-02 13.53.57.png](https://qiita-image-store.s3.amazonaws.com/0/26079/3e3ff83c-c7b9-61df-2a48-b5571edf0923.png "スクリーンショット 2016-06-02 13.53.57.png")

**列**

下記のように入力して次ボタンをクリックします。

表名 : HATAKE_LOG

| 列名 | タイプ | 精度 | スケール |
|--:|--:|--:|--:|
|ID|NUMBER|||
|TIMESTAMP|NUMBER|||
|MOISTURE|NUMBER|||


**主キー**

- 新しい順序から移入
- 主キー制約名：HATAKE_LOG_PK
- 主キー：ID(Number)
- 順序名：HATAKE_LOG_SEQ

**外部キー**

デフォルトのまま次ボタンをクリックします。

**制約**

デフォルトのまま次ボタンをクリックします。

**確認**

表を作成ボタンをクリックします。

---

これで表が作成されました。


## REST APIを作成する

次にこのデータベースにアクセスするためのREST APIを作成します。
まず最初におこなうのがRESTfulモジュールの作成です。

RESTfulモジュールは複数のREST APIをまとめておくための入れ物です。通常はアプリ一つにつき一つのRESTfulモジュールを作るようなイメージです。まずこの入れ物を作成します。

SQLワークショップ > RESTfulサービス > 作成ボタンをクリックします。
![スクリーンショット_2016-06-02_9_31_38.png](https://qiita-image-store.s3.amazonaws.com/0/26079/5ebc92ae-6209-fbc8-0074-0d01effb18e7.png "スクリーンショット_2016-06-02_9_31_38.png")
![スクリーンショット_2016-06-02_9_34_01.png](https://qiita-image-store.s3.amazonaws.com/0/26079/b8af6523-e54c-0333-dca2-2357e9d02f87.png "スクリーンショット_2016-06-02_9_34_01.png")
![スクリーンショット 2016-06-02 13.59.43.png](https://qiita-image-store.s3.amazonaws.com/0/26079/3fa5c778-b89c-08eb-798d-ea3b810b22e8.png "スクリーンショット 2016-06-02 13.59.43.png")


下記のように入力してモジュールの作成ボタンをクリックします。（下記にない項目はデフォルトのまま）

- 名前 : 畑
- URI接頭辞 : hatake/

次にテンプレートを作成します。これはAPIのURIを設定するためのものです。

左サイドバーの+テンプレートの作成をクリックします。
![スクリーンショット_2016-07-06_13_59_19.png](https://qiita-image-store.s3.amazonaws.com/0/26079/6113b254-d704-e8b8-f0d8-3d0d5d1d44f1.png "スクリーンショット_2016-07-06_13_59_19.png")
![スクリーンショット 2016-07-06 14.06.24.png](https://qiita-image-store.s3.amazonaws.com/0/26079/500f4519-d256-0948-73d0-b8730a3bda0d.png "スクリーンショット 2016-07-06 14.06.24.png")



下記のように入力して作成ボタンをクリックします。（下記にない項目はデフォルトのまま）

- URIテンプレート : log

次にハンドラーを作成します。ハンドラはテンプレート毎に設定され、そのAPIにアクセスがあった場合に実行するアクションを設定します。

左サイドバーで作成したテンプレート配下の+ハンドラの作成をクリックします。
![スクリーンショット_2016-07-06_14_00_27.png](https://qiita-image-store.s3.amazonaws.com/0/26079/8a6f8e26-6365-aa65-2429-aced753c0e77.png "スクリーンショット_2016-07-06_14_00_27.png")
![スクリーンショット 2016-07-06 14.04.07.png](https://qiita-image-store.s3.amazonaws.com/0/26079/2e97a72a-7d53-7453-6613-f38548c5f07e.png "スクリーンショット 2016-07-06 14.04.07.png")


下記のように入力して作成ボタンをクリックします。（下記にない項目はデフォルトのまま）

- 方法 : POST
- ソース・タイプ : PL/SQL
- セキュア・アクセスが必要：いいえ

```PL/SQL
begin
    insert into hatake_log (timestamp, moisture) values (:timestamp, :moisture);
end;
```

これで土壌湿度情報を受け取るためのREST APIが作成されました。

あともう一つ、保存したデータを取得するAPIも作っておきましょう。

左サイドバーの+テンプレートの作成をクリックします。
![スクリーンショット_2016-07-06_15_59_13.png](https://qiita-image-store.s3.amazonaws.com/0/26079/39d00bd7-1b98-a56d-a996-1447ba020958.png "スクリーンショット_2016-07-06_15_59_13.png")
![スクリーンショット 2016-07-06 15.59.23.png](https://qiita-image-store.s3.amazonaws.com/0/26079/ae5e2f94-3d52-e86c-c789-cecfb67648a7.png "スクリーンショット 2016-07-06 15.59.23.png")


下記のように入力して作成ボタンをクリックします。（下記にない項目はデフォルトのまま）

- URIテンプレート : log/list


ハンドラーを作成します。左サイドバーで作成したテンプレート配下の+ハンドラの作成をクリックします。
![スクリーンショット_2016-07-06_15_59_42.png](https://qiita-image-store.s3.amazonaws.com/0/26079/060d4ec3-ec15-7f4d-2ea9-2538382bfa64.png "スクリーンショット_2016-07-06_15_59_42.png")
![スクリーンショット 2016-07-06 15.59.52.png](https://qiita-image-store.s3.amazonaws.com/0/26079/af1dcd92-0e9d-59dd-0b23-a564e779e0a0.png "スクリーンショット 2016-07-06 15.59.52.png")

下記のように入力して作成ボタンをクリックします。（下記にない項目はデフォルトのまま）

- 方法 : GET
- ソース・タイプ : 問い合わせ
- 書式 : JSON
- セキュア・アクセスが必要 : いいえ

```SQL
select * from hatake_log
```


それでは早速テストしてみましょう。REST APIのテストには[apigee](http://apigee.com)を利用します。
アカウントをお持ちでないかたはまずサインアップをおこなってください。

アカウントを作成したらログインし、API Consoleを起動します。
![スクリーンショット_2016-07-06_14_24_22.png](https://qiita-image-store.s3.amazonaws.com/0/26079/da4b4444-e7c9-c517-05c1-d2d6c82ecbb9.png "スクリーンショット_2016-07-06_14_24_22.png")

apigeeは様々な有名どころのAPIアクセスをライブラリとして提供しています。
今回は今作成したばかりのカスタムREST APIにアクセスしますのでOhter (generic)を選択します。
![スクリーンショット_2016-07-06_14_27_06.png](https://qiita-image-store.s3.amazonaws.com/0/26079/c120ddcf-0f4c-cdfb-5377-b429e78903d5.png "スクリーンショット_2016-07-06_14_27_06.png")
![スクリーンショット 2016-07-06 14.29.13.png](https://qiita-image-store.s3.amazonaws.com/0/26079/8cd65496-51c1-68a9-58b3-194869b41b40.png "スクリーンショット 2016-07-06 14.29.13.png")

このコンソールではHTTPメソッドとURL、それにHTTP HeaderとBodyを設定することができ、Sendボタンを押すことでリクエスト（APIコール）が投げられます。

土壌湿度を保存するAPIはHTTPメソッドがPOST、URLがhttps://apex.oracle.com/pls/apex/あなたのワークスペース名/hatake/log となり、Bodyに送信したいデータ（timestampとmoisture）を含めます。

このリクエストを送信するには、下記のように設定してSendボタンをクリックします。

- Resource: POST https://apex.oracle.com/pls/apex/evangelist/hatake/log
- Body: 

| Parameter | Value |
|--:|--:|
| timestamp | 1499886000 |
| moisture | 50 |

成功すると右下のRequest欄にHTTP1.1 200 OKが表示さます。
![スクリーンショット 2016-07-06 17.53.26.png](https://qiita-image-store.s3.amazonaws.com/0/26079/fc1fb62d-6752-4908-494e-bf1c27ded611.png "スクリーンショット 2016-07-06 17.53.26.png")


そして実際にデータが保存されているかどうか確認するために、データを取得するAPIもコールしてみましょう。下記のように設定を変更し、Sendボタンをクリックします。

- Resource: GET https://apex.oracle.com/pls/apex/evangelist/hatake/log/list

こちらも成功すると右下のRequest欄にHTTP1.1 200 OKが表示され、その出力をみていくとJSON形式で保存されたデータを取得できているはずです。
![スクリーンショット 2016-07-06 17.52.38.png](https://qiita-image-store.s3.amazonaws.com/0/26079/a3731fe9-363f-407f-87b8-4bf636f82b7b.png "スクリーンショット 2016-07-06 17.52.38.png")


## 次のステップ

今回学んだ知識をベースに、今後本格的なサービスを開発するにあたり、下記のようなトピックを学んでください。

- 複数のデータを一度のAPIコールで保存する。
- ハンドラーで必要となるPL/SQLについて。
- APIを保護する。（認証・認可）。
- Database as a Serviceで独自SSL証明書を使ってHTTPS通信を有効化する。
- データを可視化するチャートなどのUIの開発。



> **知っておくと便利なAutoRESTについて**
> 
> スキーマサービスやapex.oracle.comではサポートされていませんが、Database as a ServiceではAutoRESTが利用できます。AutoRESTとは、REST APIを自分でわざわざ作成せずとも、テーブルに対する基本的な操作をREST APIとして利用できるようにする機能です。
>
> 例えば、とあるテーブルに1レコードを挿入する、1レコード取得する、検索結果を取得する、レコードを更新する・削除する、複数レコードをロードするといった処理がAutoRESTで実現できます。
> 
> 設定はスキーマごとに有効化をおこなうだけです。詳しくは[こちらの記事](http://qiita.com/nkjm/items/398f2fec993b216242fb)で紹介されています。