IBM developerWorks Slim マイクロフレームワークで REST アプリケーションを作成するを参考に、SlimPHPのスケルトンアプリから作成します。コードはSlimPHP3用に書き換えています。
SlimPHP:Slim マイクロフレームワークで REST アプリケーションを作成する(1)GET - tanaka's Programming Memo からの続きです。
POSTリクエストの処理
POSTリクエストは、新規リソースを作成するためのメソッドです。新規リソースの登録に必要なデータがリクエスト本体に含まれます。
- post()でルートパターンを登録する
- 登録するデータがリクエスト本体に含まれてPOSTで送信されてくる
- 登録したコールバック関数内で、リクエスト本体をデコード
- デコードしたデータをRedBeanオブジェクトに変換
- RedBeanでデータベースに保存
- 新しく作成したリソースのJSONエンコード表現を返す
以上を実装します。
リクエスト本体の取得方法はSlim3では変更されているので、公式サイトの Documentation - Slim Framework で新しい方法を調べます。リクエストに関連するものなので、左のメニューから[The Request]の下の適当なリンクを選択します。表示されるページに全ての内容が含まれるので[The Request]の下のものであれば[Overview]でも[Method]でもどれでも大丈夫です。
取得する方法は[getBody]のままと思われるので、[getBody]でページ内を検索すると解説箇所がわかります。$request->getBody()で利用出来るようなので、引数に渡される$requestから利用すればよさそうです。
Headerの設定方法も変更されています。これはGETですでに利用しています。調べ方は、Slimの公式ページのドキュメントの左から[The Response]の下のメニューを選択して、[header]で検索します。Set Headerの項目に解説があり、[withHeader('ヘッダータイプ', '設定するデータ')]で新しいヘッダー作成して、それをreturnします。
以上を対応させた上で、チュートリアルを書き換えたものが以下のコードです。
- /src/routes.php を開く
- $app->get('/articles', ・・・ から始まるコードの上に以下のコードを追加
// /articles フォルダーへのPOSTリクエストを登録 $app->post('/articles', function ($request, $response, $args) { try { // get and decode JSON request body $body = $request->getBody(); $input = json_decode($body); // store article record $article = R::dispense('articles'); $article->title = (string)$input->title; $article->url = (string)$input->url; $article->date = (string)$input->date; $id = R::store($article); // return JSON-encoded response body echo json_encode(R::exportAll($article)); return $response->withHeader('Content-Type', 'application/json'); } catch (Exception $e) { return $response ->withStatus(400) ->withHeader('X-Status-Reason', $e->getMessage()); } });
テスト
POSTメソッドをテストしてみます。FirefoxのアドオンHTTP Resource Testを利用するとよさそうです。
Firefox のアドオン HTTP Resource Test でリクエストを送信 | すぐに忘れる脳みそのためのメモ を参考に試してみます。
インストール
利用
- [ツール]メニューから[HTTP Resource Test]を選択して操作ウィンドウを開く
- URL欄に http://0.0.0.0:8080/articles と入力
- Method欄を[POST]に変更
- Client Request欄に以下を入力。JSONを文字列エンコードした登録データ
{"title":"PostTestTitle","url":"http:\/\/0.0.0.0:8080\/articles","date":"2016-02-29"}
- [Submit]ボタンを押す
- 成功すると、[Server Response]の[Body]欄に以下が表示される
[{"id":"10","title":"PostTestTitle","url":"http:\/\/0.0.0.0:8080\/articles","date":"2016-02-29"}]
以上を確認したら、HTTP Response Testの[Method]欄を[GET]に変更して[Submit]してください。登録した全てのデータが[Body]欄に表示されます。