未分類

BackboneとGoogle App Engineを使ったClient-side MVC (3/5)

REST機能の追加

前回作ったサーバは、Hello GAEをいう文字列を返すだけでしたが、今回はデータベースの内容をJSON形式で返す、RESTサーバに変更してみます。ソースコードはGitHubから取得できます。まずはコードの解説から。

前回との違いは、

  1. モデルという概念の導入
  2. JSONを返す

の2つです。まずはモデルの解説から。

モデルの導入

モデルとは、DBに格納するエンティティのことです。JavaでいうBeanみたいなもんでしょうか。今回はTODOリストなので、Taskというモデルを作ります。Modelの詳細が知りたい場合はここを見て下さい。

難しく考えることはありません。Modelを継承したクラスを作り、カラムを定義するだけです。カラムの定義はNDB Propertiesを見れば詳しいですが、よく使うものを下記に上げておきます。

  • IntegerProperty:整数型
  • StringProperty:文字型1500バイトまで
  • BooleanProperty:真偽型
  • TextProperty:長い文字列型

モデル内にto_dictという関数を定義していますが、これは次のJSONのところで解説します。

JSONを返す

前回はHandlerのget関数でテキストを返しましたが、その部分でJSONを返すように書き換えます。pythonでオブジェクトをjson文字列にエンコードするにはこのようにします。

get関数を見て下さい。まずはTask.query()を読んでいます。これはSQLでいうところのSELECT * FROM taskみたいなもんです。全部のtaskを取ってきます。そして、python特有の内包表現(ここがわかりやすい)を使って、配列の中にTaskのオブジェクト表現が詰まったものを作っています。Taskのオブジェクト表現を作るために、モデルにto_dict関数をつけています。

to_dict関数の中で、keyというプロパティを追加しています。これは、クライアント(ブラウザで動いているJavascriptです)がDBを操作するときにキーが必要になりますよね。例えば、あるTaskを完了にしたいとか。そういう時のためにkeyを追加しています。

GAEのモデルはツリー上に親子関係を持って作ることができます(今回は親がいません)。そして、Beanごとのidは同じ親の間では一意ですが、違う親の子どもと重なる可能性はあります(長男、次男、三男みたいな感じで考えてもらえば分かりやすいです)。なので、全てのBeanで一意になるidとしてurlsafe()というkeyを用意しています。長ったらしいkeyですが、一意になるのでこれを使うのが間違いないです。

データを入れる

モデルは作ったものの、初期データがないのでまずはデータを手動で追加します。GAEには管理コンソールが用意されていて、ここからデータベースを直接触ることができます。

Screen Shot 2015-05-04 at 2.06.58 PM

管理コンソールのアドレスはLauncherのAdmin Portを見て下さい。管理コンソールを開くと、Interactive Consoleをいうものがあります。ここにPythonコードを書いてデータベースを操作します。

Screen Shot 2015-05-05 at 11.14.50 AM(1)

追加するためのコードは次のようになります。これを貼り付けて、下にあるExecuteボタンを数回押しましょう。これでタスクの初期データが登録できます。

登録を確認するには、管理コンソールのDatastore Viewerを開きます。下記のようになっていれば無事にTaskが登録されたことが分かります。

Screen Shot 2015-05-05 at 11.15.22 AM

ブラウザでRESTを確認

さて、いよいよブラウザからRESTの動作を確認します。ブラウザを開き、アドレスバーにlocalhost:xxxx/taskを打ち込んで見ましょう(xxxxはLauncherに書いてあるポート番号)。下記のように出力されたら無事RESTの成功です。

REST操作の追加

ここまで来たら、あとは追加、編集、削除の機能をサーバ側に加えていきましょう。 ハンドラのコードはこのようになります。

curlで確認

ブラウザからPOSTを送ることはできないので、curlコマンドを使います(mac osXは標準装備)。

これでJSONらしきものが帰ってきたら成功です。再びブラウザからlocalhost:11080/taskを売ってみましょう。JSONにエンティティが追加されているはずです。

次回は

さて、これでサーバ側の準備は整ったので、次回はクライアントにBackboneを導入し、BackboneからREST通信をしてみます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です