Web APIサーバーをpython+falconで構築する

Web APIが熱いらしい。Web APIとはhttp://hoge/dataみたいなURLにhttpのGETメソッドをやると、レスポンスでjsonデータを返してくれるようなやつ。TwitterのAPIでタイムラインを取得するようなやつはまさにこれを使っている。RESTなAPIというらしい。言葉はどうでもいい。

んで、pythonで自分でWeb APIのサーバー立てて動作を確認したいなあと思ってやってみたら、驚くほど簡単にできたので実装メモ。Web APIを実現するにあたり、pythonのfalconというpackageを使った。どうぞpip install falconでインストールしてほしい。
サーバー側のソースは下記。

ポイントとしては、
api.add_route(‘/vehicle/12345678’, ItemsResource())
でデータを格納するURL(リソース)を決める。
その後、
httpd = simple_server.make_server(‘127.0.0.1′, 8000, api)
httpd.serve_forever()
でそのリソースをhttp://127.0.0.1:8000の上で動作させてやる感じ。
こうするとhttp://127.0.0.1:8000/vehicle/12345678 にGETやらPOSTのメソッドを送ってやるといろいろ処理できる。
このサンプルではGETメソッドでサーバー上の変数itemsの値が取得できるようになっている。
def on_get(self, req, resp):
”’ Handles GET requests ”’
resp.body = json.dumps(self.items)
の部分でGETメソッドがされた時に、レスポンスのBodyにjsonデータを格納してクライアントに返す。
def on_put(self, req, resp):
print ‘put’
body = req.stream.read()
data = json.loads(body)
print data
try :
self.items[‘Components’][‘GW’] = data[‘Components’][‘GW’]
self.items[‘Components’][‘ECU1’] = data[‘Components’][‘ECU1’]
の部分でPUTメソッドが来た時に、リクエストのBody(jsonが入る)を読んでそのjsonでitemsを更新してやる。
クライアント側の処理は下記。ポイントは後述する。

GETメソッドの場合は
h.request(‘GET’, ‘/vehicle/12345678’)
のようにやり、これのresponseをjsonで読み込むことでサーバー上のitemsと云う変数の値を取得できる。
PUTメソッドの場合は逆にサーバー上のitemsと云う変数を更新するために、同じ形式のjsonを
h.request(‘PUT’, ‘/vehicle/12345678’, json.dumps(data))
で第3引数にjsonデータを入れてやる。するとサーバーのon_putに通知が行き、
body = req.stream.read()
でサーバー側はjsonデータを読んで値を更新する。簡単だね。
ソースと使い方は下記に格納してあるのでご参考。
https://github.com/yheihei/python/tree/master/webapi