tanaka's Programming Memo

プログラミングについてのメモ。

SlimPHP:Slim マイクロフレームワークで REST アプリケーションを作成する(3)PUT/DELETE

前へ | 次へ


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サーバーも利用できないようです。

ここではテストを簡単にするために、TwitterAPIを参考にします。すなわち、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でテストしてみましょう。

  • Firefoxの[ツール]>[HTTP Response Test]を選択して、ウィンドウを開く
  • URI欄に以下を入力
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欄に更新内容が表示されます。

以上を実行すると、該当データがないので[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 にアクセスして、データを見てみましょう。


次は、認証の追加です。


前へ | 次へ