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 にアクセスして、データを見てみましょう。
次は、認証の追加です。