主夫ときどきプログラマ

プログラミング、Webエンジニアリング、etc

GoogleAppEngineで構築する簡単RestfulServer


WebServiceに保存されているデータを外部に公開したい場合、WebAPIという形で公開するケースがあります。
しかし、実際にWebAPIを作成しようと思うと、リクエストパラメータを解析して処理を決めたり、XMLJsonフォーマットに変換するなど手間がかかります。


今回はそんなWebAPIをGoogleAppEngineを使って公開する方法を紹介します。
GoogleAppEngineのDataStoreに保存されているデータをModelの構造のまま取得したり、
更新したりすることが簡単にできます。

appengine-rest-server を使う

GoogleAppEngineには「appengine-rest-server」というフレームワークがあります。
GoogleCodeで開発されていて、これを使うことで簡単にRestfulなWebAPIを作成することができます。

ではダウンロードして設置してみましょう。
本記事の執筆時には1.0.5が最新のようですが、以下のコードは1.0.4で作成されています。

appengine-rest-server を設置する

ダウンロードしたファイルを解凍すると、READMEやLICENSEなどのテキストとsrcフォルダが展開されます。
srcフォルダの階層下にrestというフォルダがあるのでそれをGoogleAppEngineのアプリケーションフォルダにコピーします。

$ unzip appengine-rest-server-1.0.4.zip
$ cd appengine-rest-server-1.0.4/src/main/python/
$ cp -rf rest /path/to/appengine/app

これで設置は完了です。
SDKコンソールのInteractive Console で

import rest

が実行できたら問題なくインストール出来ています。

動かしてみよう

今回はアプリケーションのルートにapiというフォルダを作成し、その中のsample.pyにappengine-rest-serverを実装します。
まずは、app.yamlにURLを登録しましょう。以下のようにURLを登録してください。

-url: /api/.*
  script: /api/sample.py

つぎはsample.pyです。rest.Dispatcherというオブジェクトに公開したいModelを登録するだけです。

from google.appengine.ext import db
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
import rest

# 公開したいModel
class Task(db.Model):
    title = db.StringProperty()
    author = db.StringProperty()
    achieved = db.BooleanProperty(default=False)
    created = db.DateTimeProperty(auto_now_add=True)

# サンプルデータの登録
Task.get_or_insert('task1', title='Foo', author='Tom')
Task.get_or_insert('task2', title='Bar', author='Jhon', acheved=True)

# ベースアドレスを登録し、公開するモデルを登録します
rest.Dispatcher.base_url = '/api'
rest.Dispatcher.add_models({
    'task'   : (Task, ['META_DATA', 'POST', 'GET']),
    })  

application = webapp.WSGIApplication([
    ('/api/.*', rest.Dispatcher)
    ], debug=True)

def main():
    run_wsgi_app(application)

if __name__ == '__main__':
    main()

rest.Dispatcher.add_modelsに公開したいModelを登録します。複数登録できますが、今回は1つだけ。
また、対応するHttpMethodも指定することができます。

ブラウザからアクセスしてみよう

GoogleAppEngineLauncherを起動してアクセスしたのが以下の画面です。
一覧表示 http://localhost:8080/api/task


Key指定表示 http://localhost:8080/api/task/agxrYXdhaWljcnVpc2VyDwsSBFRhc2siBXRhc2sxDA


その他metadataなどを表示することができます。
また、FirefoxのRESTClientアドオンを使うことで、データ登録の動作確認ができます。
POSTメソッドでデータをXMLで送信することで登録できます。