WebServiceに保存されているデータを外部に公開したい場合、WebAPIという形で公開するケースがあります。
しかし、実際にWebAPIを作成しようと思うと、リクエストパラメータを解析して処理を決めたり、XMLやJsonフォーマットに変換するなど手間がかかります。
今回はそんな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で送信することで登録できます。