読者です 読者をやめる 読者になる 読者になる

appengne-rest-server で作る簡単 Web API

python appengine

はじめに

リッチな UI を持つ Web アプリを作るなら、クライアントは Ajax か Flash、または Silverlight を使うと思う。そうすると、表示するデータを非同期に JSON または XML で取得するために、Web API を実装することになる。

でも、リクエストパラメータを解析して処理を決めたり、結果を XML や JSON に変換したりと、Web API を一から実装するのは大変。

Google App Engine の場合

Web アプリ開発の経験は Google App Engine だけなので、GAE の話になるけど、GAE には『appengine-rest-server』というフレームワークがある。

.NET の WCF Data Services みたいなフレームワークで、これを使えば簡単に RESTFul な Web API を実装できる。

使い方はいたって簡単

rest.Dispatcher に、公開したいモデルを指定するだけ。

#!/usr/bin/env python

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

# RESTful な API で公開したいモデル
class Task(db.Model):
    name = db.StringProperty()
    done = db.BooleanProperty(default=False)
    created = db.DateTimeProperty(auto_now_add=True)

class MainHandler(webapp.RequestHandler):
    def get(self):
        self.response.out.write('Hello world!')

# ベースアドレス指定
rest.Dispatcher.base_url = '/rest'

# 公開するモデルを登録
rest.Dispatcher.add_models({
    'tasks': Task,
    })

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

# テストデータを挿入
Task.get_or_insert("test1", name="Foo")
Task.get_or_insert("test2", name="Bar", done=True)
Task.get_or_insert("test3", name="Hoge", done=True)
Task.get_or_insert("test4", name="Fuga")

def main():
    util.run_wsgi_app(application)

if __name__ == '__main__':
    main()

API を呼び出してみる

開発サーバーを起動して、http://localhost:[ポート番号]/rest/tasks/ に接続したのが下の画面。
f:id:griefworker:20100601114549p:image
テストデータが全部表示されている。

絞り込むことも可能。試しに、done=Falseのものだけ取得してみる。http://localhost:[ポート番号]/rest/tasks?feq_done=False に接続した画面がこちら。
f:id:griefworker:20100601114602p:image
ちゃんと絞り込まれている。

データを絞り込む詳しい方法は、appengine-rest-server のドキュメントを参照のこと。試していないけど、ソースを見る限り、結果を JSON でも取得できるようだ。

簡単に Web API が実装できて便利だけど、足りない機能はある

まず、まだ認証機能が無い。「Read は誰でも許可するけど、それ以外はログイン必須」とかできない。Issue にチケットがあるので、そのうち実装されるかも。アプリ内でしか使わないなら、Dispatcher がハンドルする URL を app.yamlでログイン必須にしてやれば十分。

あと、更新するときは PUT メソッドを使うけど、リクエストの BODY に XML しか指定できないのは不便。JSON の方が楽なのに。こちらは今後に期待。

まとめ

Ajax とか Flash を使った Web アプリを作る機会は増えているから、appengine-rest-server みたいに Web API を簡単に作れるフレームワークは必要だと思う。Kay Framework に組み込まれないかと密かに期待している。