PHP on sMash – 第4回 REST/リソース・ハンドラー(1/2)
Posted by Kenta Takahashi on 12月 1st, 2008. Other posts by Kenta Takahashi
PHP on sMash -sMashとPHPで作るRESTful Webアプリケーション- 第4回はREST/リソース・ハンドラーです。sMashでは、RESTを実装するためのコンベンションが用意されており、容易にRESTful アプリケーションを作成することができます(RESTについてはこちらのhirotさんの記事を参照下さい)。今回も引き続き、前回までに構築された環境を用いますので、第1回と第2回をご覧になっていない方は、そちらから環境の構築を行ってください。今回も、説明を加えながらスクリプトを書いていくことにします。それでは始めていきましょう。
●リソース・ハンドラーとは?
リソース・ハンドラーとは、リソース(DB内のデータなど)を触るためのWebサービスのことです。例えば、ある文字列を与えると、DB内からその文字列で検索して値を返してくれるようなアプリケーションは、リソース・ハンドラーと言えます。リソース・ハンドラーは、大きく分けて「検索」「作成」「更新」「削除」という4つの機能が必要になります。これらはそれぞれ、SQL文では「SELECT」「CREATE」「UPDATE」「DELETE」に相当します。これらの機能をそれぞれ、HTTPメソッドにおける「GET」「POST」「PUT」「DELETE」に割り当てることで、RESTfulなアプリケーションを作成することができます。これらのHTTPメソッドに対して、sMashはコンベンションを持っており、それらを実装することで、RESTを実装することができるというわけです。そのコンベンションは以下のようになっています。
| Method | URI | …invokes handler in app/resources/people/ |
…with event data |
|---|---|---|---|
| GET | /resources/people | people.php People:onList() |
|
| POST | /resources/people | people.php People::onCreate() |
|
| PUT | /resources/people | people.php People::onPutCollection() |
|
| DELETE | /resources/people | people.php People::onDeleteCollection() |
|
| GET | /resources/people/1/acc | people.php People::onRetrieve() |
zget(’/request/params/peopleId’)=1 zget(’/event/pathInfo’) = /acc |
| PUT | /resources/people/1 | people.php People::onUpdate() |
zget(’/request/params/peopleId’)=1 |
| POST | /resources/people/1 | people.php People::onPostMember() |
zget(’/request/params/peopleId’)=1 |
| DELETE | /resources/people/1 | people.php People::onDelete() |
zget(’/request/params/peopleId’)=1 |
表の見方ですが、一例を挙げて説明します。まず、開発者はpeople.phpというファイルを用意し、それをsMashの/app/resourcesフォルダに配置します。ユーザーがhttp://***/resouces/people/1というURIに、GETメソッドを用いてアクセスした場合、sMashは第3回で説明したグローバル・コンテキストのrequestゾーンに1という値を格納し、people.phpに書かれているonRetrieveメソッドを自動で実行します。そのonRetrieveメソッドの中には、1という値でDBをSELECTして値をユーザに返す内容を書きます。先ほど、4つの機能と言いましたが、上の表では8つの関数があり、「検索」が2種類に分かれています。本来、「検索」は単一のデータを取得すること(ここではonRetrieveメソッド)を意味していましたが、現実には複数のデータを取得することが必要になる場合が多いため、それを実現するonListメソッドが用意されています。また、8つの関数のうち、実際には、onList, onRetrieve, onCreate, onUpdate, onDeleteの5つの関数を実装すれば十分です。
sMashでは、この”リソース・ハンドラーを書くこと”、つまり”上の5つのメソッドを実装すること”で、容易にDBの操作をするWebサービスを構築することができます。
●リソース・ハンドラーを書いてみる
ここからは、実際にリソース・ハンドラーを書くことで理解していきましょう。eclipseを起動し、restphpプロジェクトの/app/resourcesフォルダを右クリックし、New > PHP Fileをクリックします。名前をuriage.phpとし、Finishを押します。
リソース・ハンドラーでは、まずファイル名と同一のクラスを作成する必要があります。uriageクラスを作成します。そして、その中にonList, onRetrieve, onCreate, onUpdate, onDeleteの5つのメソッドを作ります。今回は、onListメソッドのみを実装することにしましょう。以下のソースコードを貼り付けて下さい。
<?php
$dataManager = dataManager("mysql_db01");
class uriage {
function onList() {
global $dataManager;
$items = dataExec($dataManager, "SELECT * FROM uriage");
if (is_null($items)) { print "error!"; }
else {
zput("/request/status", 200);
zput("/request/headers/out/Content-Type", application/json");
print json_encode($items);
}
}
function onRetrieve() {
}
function onCreate() {
}
function onUpdate() {
}
function onDelete() {
}
}
?>
保存したら、アプリケーションを起動してください。このアプリケーションは、DB内のデータをJSON形式にして、HTTPステータスコード200、Content-Typeとしてapplication/jsonを返すWebサービスになっています。
最後に、テストを行うため、Firefoxを起動します。Ctrl+PでPOSTERのウィンドウを開き、URL欄にhttp://localhost:8080/resources/uriageと入力し、GETと書かれたドロップダウンメニューの横のGOボタンを押してください。
DB内のデータがJSON形式で返ってくれば成功です。
失敗した場合は、eclipseのコンソールなどを確認して下さい。よくある間違いをいくつか上げてみましたので参考にしてみてください。
- error!と返ってくる : MySQLが起動しているかどうか確認して下さい。また、DBの設定が正しいかどうか確認して下さい。確認には第2回の記事を参考にしてみてください。
- データが返ってこない : クラス名がファイル名と同一になっているか確認して下さい。
これで、データの一覧取得のみが実装されたリソース・ハンドラーを作ることができました。次回は、残りのonRetrieve, onCreate, onUpdate, onDeleteメソッドを実装していきましょう。



Leave a Reply