Shoeisha Technology Media

CodeZine(コードジン)

特集ページ一覧

Webブラウザからも可能! REST APIでOracle Database Cloud上のデータにアクセスする

Oracle Database Cloudでいってみよう! ~ モダンな企業向けクラウドアプリを一番かんたん・安全につくる方法 【第4回】

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2016/02/03 14:00

 Oracle Database Cloudの特徴の1つに、セキュアなデータアクセスを実現するREST APIを、データベースが直接提供する点が挙げられます。データアクセスに他のサービスを介さないため、アプリケーションのアーキテクチャがぐっとシンプルになります。今回は、このREST APIを利用してデータアクセスする方法を紹介します。

なお、今回の説明は、Oracle Cloud上にデータベースサービスの環境をすでにお持ちであることを前提に進めます。データベースサービスの環境をお持ちでない方は、こちらの記事を参照してトライアル環境を取得してみてください。

また、スキーマサービスを前提として手順を記載していきますが、ほとんどの項目はインスタンスサービス(Database as a Service)でも同様に適用できるはずです。

REST APIコンソール

まず、REST APIを作成するためのコンソールにアクセスします。

Oracle Cloudにログインした直後のダッシュボードページから、データベース・スキーマサービスの「サービス・コンソールを開く」をクリックします。

データベース・スキーマサービスの「サービス・コンソールを開く」をクリック
データベース・スキーマサービスの「サービス・コンソールを開く」をクリック

コンソールのトップページが表示されます。ここで上段のSQL Workshopのプルダウンメニューから「RESTful Services」を選択します。

「RESTful Services」を選択
「RESTful Services」を選択

この画面がREST APIを作成・管理するときのホームページとなります。次図のように、サンプルのモジュールがあらかじめ1つ用意されています。このモジュールをクリックしてみると、empテーブル[1]にアクセスする一連のAPIを確認することができます。

サンプルのモジュールがあらかじめ1つ用意されている
サンプルのモジュールがあらかじめ1つ用意されている
モジュールをクリックすると、empテーブルにアクセスする一連のAPIを確認できる
モジュールをクリックすると、empテーブルにアクセスする一連のAPIを確認できる

[1]: empテーブルは社員をイメージしたテーブルで、サンプルテーブルとして用意されています。

REST APIの構造を理解されている方は、このAPI設定をいくつか確認してみることで「あーなるほど」と設定方法について概ね理解できるかもしれません。

以降では、基本的なユースケースに沿ってREST APIの作成方法を説明していきます。

REST API設定の構造

REST API設定は次の3つのコンポーネントで構成されます。

モジュール
トップレベルのコンポーネント。このAPIへのアクセスに必要な権限の設定やCORS設定を行う。
URIテンプレート
各APIのURIを設定する。
ハンドラー
HTTPメソッドごとにどのようなアクションを実行するかを設定する。URIテンプレートごとに作成する。

モジュール、URIテンプレート、ハンドラーの各コンポーネントの関係を図で表すと、次のようになります。

モジュール、URIテンプレート、ハンドラーの関係(注:URLは、スキーマサービスでは上記フォーマットになりますが、インスタンスサービスの場合は若干異なります)
モジュール、URIテンプレート、ハンドラーの関係(注:URLは、スキーマサービスでは上記フォーマットになりますが、インスタンスサービスの場合は若干異なります)

この図のとおり、各APIはURIテンプレートの文字列、そしてハンドラーが指定するHTTPメソッドによって一意に識別され、アクセスすることができます。追加でモジュールに各URIテンプレートに共通するURIプリフィックスを設定することもできます。

それではREST APIの設定を進めていきましょう。

テーブルの全レコードを取得するAPIを作成する

まず、REST APIの新しいモジュールを作成します。前述のサンプルモジュールに含まれる機能ではありますが、empテーブルの社員情報を操作するAPIを作成してきます。

REST API管理のホームページで[Create]ボタンをクリックします。

REST API管理のホームページで[Create]ボタンをクリック
REST API管理のホームページで[Create]ボタンをクリック

モジュール作成のフォームに遷移します。本来モジュールに含まれる設定は「RESTful Service Module」セクションにあるパラメーターのみですが、このフォームではその配下のURIテンプレートとハンドラーを同時に1つ作成できるようになっています。ただし、ここではコンポーネントごとに順を追って設定を行うため、「RESTful Service Module」セクションのみ設定します。

モジュール作成のフォーム
モジュール作成のフォーム
Name
このモジュールの名前です。ここでは「社員」とします。
URI Prefix
このモジュール配下のURIテンプレートに共通する接頭辞(Prefix)です。ここでは設定しません。
Origins Allowed
いわゆるCORS(Cross Origin Resource Sharing)設定です。このモジュールのAPIへのアクセスを許可するドメインを指定します。ここではどのドメインからでもアクセスを許可するため「*」とします。
Required Privilege
このモジュールのAPIへのアクセスを許可する権限です。ここではデフォルトの「Assign Privilege」のままとし、このモジュールのAPIアクセスには認証を不要とします。

上記のとおり設定したら[Create Module]ボタンをクリックします。これでモジュールが作成されました[2]

[2]: 筆者の環境では、なぜか「Origin Allowed」が一度では保存されませんでした。モジュールが作成された後に「Origin Allowed」項目を確認し、もし設定が入っていなければ再度「*」を入力して、[Apply Change]ボタンで保存してください。

続けて、このモジュール配下にURIテンプレートを作成していきます。

まず全社員リストを取得するためのURIテンプレートを作成してみましょう。画面左の「+ Create Template」をクリックします。

全社員リストを取得するためのURIテンプレートを作成開始
全社員リストを取得するためのURIテンプレートを作成開始

全社員を取得するAPIには、「http[s]://[あなたのドメイン]/apex/employee/list」というURLをアクセスさせることを想定し、URI Templateは「employee/list」とします。他のパラメーターはひとまずデフォルト値のまま[Create]ボタンをクリックします。

全社員を取得するAPIの設定
全社員を取得するAPIの設定

次に、このAPIコールで実行されるクエリー(Query)を設定するためのハンドラーを作成します。画面左の「+ Create Handler」をクリックします。

APIコールで実行されるクエリー(Query)を設定するためのハンドラーを作成
APIコールで実行されるクエリー(Query)を設定するためのハンドラーを作成

ハンドラーで特に重要なのはMethodとSourceです。

ハンドラーの設定
ハンドラーの設定
Method
このハンドラーに対応するHTTPメソッドを指定します。REST APIの慣習としてデータを取得するAPIの場合はGETメソッドが用いられますので、今回もそれに習って「GET」とします。
Source Type
実行するアクションを指定します。今回はSQL文で複数レコードを取得するため「Query」とします。
Format
レスポンスのフォーマットを指定します。ここでは「JSON」とします。
Required Secure Access
HTTPSによるアクセスを強制するかどうかを指定します。ここでは「Yes」とします。
Pagenation Size
1回のAPIコールで取得できるレコード数を指定します。この値を設定した場合、超加したレコードについては、レスポンスに含まれる「next」属性で指定されているURLにアクセスすることで、再帰的に取得することができます。ここではデフォルトのまま未設定とします。
Source
実行するSQL文を指定します。ここではempテーブルの全レコードを取得するため、次のSQL文を設定します[3]
select * from emp

[3]: 末尾にセミコロンを入れるとAPIコール時にエラーとなるので注意してください。

全社員情報を取得するためのAPI設定が完了しました。画面下の方に[Test]ボタンが用意されています。このボタンをクリックすると、このAPIにブラウザでアクセスして結果を確認することができます。

作成したAPIにブラウザでアクセスして結果を確認
作成したAPIにブラウザでアクセスして結果を確認

設定が正しく行われていれば、結果が次のようにJSONフォーマットで表示されます。

正しく設定されていればJSONフォーマットで結果を表示
正しく設定されていればJSONフォーマットで結果を表示

なお、ここでは単純に全件取得のクエリーを設定しましたが、SQL文によって、検索結果はいかようにもカスタマイズできます。

動的なパラメーターを含むAPIを作成する

次は、より動的なAPIを作成してみましょう。先ほどは完全に静的なURIでしたが、今回はURIの中に社員番号を埋め込み、社員を動的に指定できるようにします。具体的には、次のようなフォーマットでアクセスできるAPIを作成します。

http[s]://[あなたのドメイン]/apex/employee/[社員番号]

先ほど作成した社員モジュールの中に新しいURIテンプレートを作成するため、「Create Template」をクリックします。

先ほど作成した社員モジュールの中に新しいURIテンプレートを作成
先ほど作成した社員モジュールの中に新しいURIテンプレートを作成

「URI Template」に「employee/{employeeId}」を指定します。波括弧で指定した文字列はバインド変数と呼ばれ、URIの中でこの部分が動的に指定されることを示しています。そして後に設定するクエリーの中で値を参照することができるようになります。これで[Create]ボタンをクリックします。

URI Templateを指定
URI Templateを指定

URIテンプレートが作成されたら、ハンドラーを作成するために「Create Handler」をクリックします。

ハンドラーの作成開始
ハンドラーの作成開始

そして、次のようにハンドラーの詳細を設定します。

ハンドラーの詳細を設定
ハンドラーの詳細を設定
Method
今回も情報を取得するAPIなので「GET」とします。
Source Type
今回は1行だけ取得するAPIコールなので「Query One Row」とします。
Source
URI Templateで指定した{employeeId}をキーとして社員を検索するSQL文を下記のように設定します。
select * from em where empno = :employeeId

上記のとおりに設定したら、[Create]ボタンをクリックしてハンドラーを作成します。作成できたら、次のようにempテーブル内に存在する社員番号を指定して、アクセスしてみてください[4]

http[s]://[あなたのドメイン]/apex/employee/7839

[4]: URLの「7839」が社員番号です。ご自身の環境に存在するものに置き換えてください。

次のように、JSONフォーマットのデータが返されれば成功です。

JSONフォーマットのデータが返されれば成功
JSONフォーマットのデータが返されれば成功

レコードを挿入するAPIを作成する

それでは最後に、レコードを挿入するAPIを作成します。先ほど作成した社員モジュールの中に新しいURIテンプレートを作成するため、「Create Template」をクリックします。

社員モジュールの中に新しいURIテンプレートを作成開始
社員モジュールの中に新しいURIテンプレートを作成開始

今回のAPIには、「http[s]://[あなたのドメイン]/apex/employee」というURLでアクセスすることを想定し、「URI Template」に「employee」を指定して「Create]ボタンをクリックします。

URI Templateに「employee」を指定
URI Templateに「employee」を指定

URIテンプレートが作成されたら、ハンドラーを作成するために「Create Handler」をクリックします。

ハンドラーの作成開始
ハンドラーの作成開始

そして、やはり次のようにして、ハンドラーの詳細を設定します。

ハンドラーの詳細を設定
ハンドラーの詳細を設定
Method
今回はレコードを作成するAPIなので「POST」とします。
Source Type
PL/SQLを指定します。
Source
社員レコードを挿入するPL/SQL文を下記の通り設定します。
begin
     insert into em (ENAME) values (:ENAME);
end;

「:ENAME」はバインド変数で、POSTリクエストのBodyにセットされたJSONフォーマットのデータがここにセットされます。

上記のとおりに設定したら、[Create]ボタンをクリックしてハンドラーを作成します。

これでレコードを挿入するAPIが完成しました。ただし、このAPIをテストをするにはPOSTリクエストを生成する必要があるので、少しセットアップが必要です。筆者はChromeブラウザの「Advanced REST Client」というアドオンを使ってPOSTリクエストをテストしています。

Advanced REST Clientで今回のAPIにアクセスするには、次図のようにパラメーターをセットし、[Send]ボタンをクリックするだけです。

Advanced REST ClientでAPIにアクセスするには<br/>パラメーターをセットし[Send]ボタンをクリックするだけ
Advanced REST ClientでAPIにアクセスするには
パラメーターをセットし[Send]ボタンをクリックするだけ

HTTPメソッドとしてPOST、BodyにJSONフォーマットで「{"ENAME":"KAZUKI"}」と送信するデータを入力しています。また、コンテンツタイプとして「application/json」を指定しています。

このリクエストがステータスコード200で返ってくれば成功です。データベースにレコードが挿入されているかどうか確認してみてください。

まとめ

今回はクラウドサービスにおけるAPIの標準形ともいえるREST APIで、Oracle Database Cloudにアクセスする方法を紹介しました。REST APIはサービス間連携で必要となるだけでなく、モバイルアプリケーションやHTML5アプリケーションを提供する際には必須の機能です。

従来RDBMSではODBCやJDBCといった接続方法が主流でしたが、Oracle Database Cloudではクラウドでのユースケースで必要とされるREST APIで直接データベースにアクセスできるようになっています。この機能を活用することで、よりシンプルなアーキテクチャーでモバイルやHTML5、複数のサービスを組み合わせたエコシステムといった新しい利用シーンに対応できるでしょう。

  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • 中嶋 一樹(ナカジマ カズキ)

    日本オラクルのエバンジェリスト。Cloud Platformに関するエンジニアリングと啓蒙活動を担当。クラウドのビルディングブロックを使ったモダンなアプリケーションの開発、エコシステムの構築をライフワークにしている。公私ともに何かを開発していることが多い。

All contents copyright © 2005-2019 Shoeisha Co., Ltd. All rights reserved. ver.1.5