Zend Framework で REST なサービスを作る準備
最近、勉強のために REST っぽいサービスのサンプルを作りたいなと思っています。でもいちからゴリゴリ書くよりフレームワークで何とかしたい、と思ったので PHP の Zend Framework で REST サービスを作る方法を調べています。まだ調べている段階ですがとりあえず現時点のメモ。
ちなみに ZF のバージョンは 1.11.5 です。
Bootrtrap.php で Zend_Rest_Route を使うよう設定
どこからかコピったソースですが。。
<?php protected function _initRoutes() { $this->bootstrap('frontController'); $frontController = Zend_Controller_Front::getInstance(); $restRoute = new Zend_Rest_Route($frontController); $frontController->getRouter()->addRoute('default', $restRoute); }
コントローラは Zend_Rest_Controller を継承
Zend_Controller_Action の代わりに Zend_Rest_Controller を使います。
注意すべき点は、以下の 5 つのメソッドを定義しないと動かないことです。
- indexAction()
- getAction()
- postAction()
- putAction()
- deleteAction()
リクエストの処理関連
XML を POST された場合は、以下でその XML を取得できます。
<?php $this->getRequest()->getRawBody();
Content-Type(application/x-www-form-urlencoded や application/xml)は以下で取得できます。
<?php $this->getRequest()->getHeader('Content-Type');
リクエストのテスト - curl
curl で application/x-www-form-urlencoded なデータを送るときは、下のような感じ。
curl -d "foo=bar&hoge=hoge" [サービスの URL]
application/xml の場合は Content-Type で指定しておきます。Windows のコマンドプロンプトではシングルクオートを使うと -H がちゃんと設定されないので注意です。
curl -H "Content-Type: application/xml" -d "<?xml version='1.0'?><doc><item>Some content.</item></doc>" [サービスの URL]
PUT や DELETE ですが、とりあえず 3 つ方法があるっぽいです。
- -X PUT
- -d "_method=PUT" (オーバーロードPOST、Ruby on Rails はこれらしい)
- -H "X-HTTP-Method-Override: PUT" (オーバーロードPOST、GData API はこれらしい)
Zend Framework の REST ライブラリはどれも認識してくれます。
-H "X-HTTP-Method-Override: DELETE" については -d "dummy=dummy" のように何か適当にダミーの値を送っておかないと DELETE と見なされないみたいです。
レスポンス(アクションメソッド内で)
ビューテンプレートの拡張子を変更。
<?php $this->_helper->viewRenderer->setViewSuffix('xml.php');
viewRenderer を使わない場合。
<?php $this->_helper->viewRenderer->setNoRender(true); $this->getResponse()->appendBody("Not found.");
レスポンスコードを設定。
<?php $this->getResponse()->setHttpResponseCode(409)
ロケーションを返す。
<?php $this->getResponse()->setHeader("Location", "/user/john");