IBM developerWorks Slim マイクロフレームワークで REST アプリケーションを作成するを参考に、SlimPHPのスケルトンアプリから作成します。コードはSlimPHP3用に書き換えています。
SlimPHP:Slim マイクロフレームワークで REST アプリケーションを作成する(2)POST - tanaka's Programming Memo からの続きです。
PUTリクエストとDELETEリクエストの処理
PUTリクエストは、既存のリソースを変更するのに利用します。どのリソースかを示すためのリソースIDが必要になります。
DELETEリクエストは、リソースの削除を指示するものです。
RESTで利用することになっているPUTやDELETEメソッドですが、WebブラウザーやHTTPサーバーの設定次第では使えない場合があります。テストに利用しているPHPの組み込みHTTPサーバーも利用できないようです。
ここではテストを簡単にするために、TwitterのAPIを参考にします。すなわち、POSTメソッドのアクセスに対して、最後に/putがあればPUTメソッド、/deleteがあればDELETEメソッドとして処理することにします。put()とdelete()も設定しておけば、本来のPUTやDELETEメソッドにも対応できます。
PUTによる更新処理
- src/routes.php を開く
- 一番下に以下のコードを追加
// /articles/{id}の更新処理を設定 $app->post('/articles/{id}/put', function ($request, $response, $args) { try { // get and decode JSON request body $body = $request->getBody(); $input = json_decode($body); // IDの取得 $route = $request->getAttribute('route'); $id = $route->getArgument('id'); // query database for single article $article = R::findOne('articles', 'id=?', array($id)); // store modified article // return JSON-encoded response body if ($article) { $article->title = (string)$input->title; $article->url = (string)$input->url; $article->date = (string)$input->date; R::store($article); // ヘッダ echo json_encode(R::exportAll($article)); return $response->withHeader('Content-Type', 'application/json'); } else { throw new ResourceNotFoundException(); } } catch (ResourceNotFoundException $e) { return $response->withStatus(404); } catch (Exception $e) { return $response ->withStatus(400) ->withHeader('X-Status-Reason', $e->getMessage()); } });
(戻り値の$responseに不要な()が付いていたので削除 2016/4/10)
PUTのテスト
HTTP Resource Testでテストしてみましょう。
http://0.0.0.0:8080/articles/2/put
- Method欄を[POST]に変更
- [Client Request]欄に以下を入力
{"title":"PutTest","url":"http:\/\/0.0.0.0:8080\/articles\/2\/put","date":"2016-03-01"}
- [Submit]ボタンを押す
以上で、成功すると一番下のBody欄に更新内容が表示されます。
- URI欄をhttp://0.0.0.0:8080/articles/1000/putに変更して[Submit]を押す
以上を実行すると、該当データがないので[Server Response]の[Headers]欄の1行目が「HTTP/1.1 404 Not Found」になります。プログラム内で設定した $response->withStatus(404) が正常に動作しているのが確認できます。
DELETEによるリソースの削除
src/routes.php の一番下に、以下のコードを追加してください。
// /articles/{id}/delete の削除処理を設定 $app->post('/articles/{id}/delete', function ($request, $response, $args) { try { // query database for article $route = $request->getAttribute('route'); $id = $route->getArgument('id'); $article = R::findOne('articles', 'id=?', array($id)); // delete article if ($article) { R::trash($article); return $response->withStatus(204); } else { throw new ResourceNotFoundException(); } } catch (ResourceNotFoundException $e) { return $response->withStatus(404); } catch (Exception $e) { return $response ->withHeader('X-Status-Reason', $e->getMessage()) ->withStatus(400); } });
削除のテスト
FirefoxのHTTP Response Testで以下を入力
- URI欄に以下を入力
http://0.0.0.0:8080/articles/2/delete
- Method欄を[POST]に変更
- [Submit]ボタンを押す
以上で成功すればデータが消えているはずです。Webブラウザで http://0.0.0.0:8080/articles にアクセスして、データを見てみましょう。
次は、認証の追加です。