2011年7月1日金曜日

08.Defining a service

「サービス」は、「Service」(protorpc.remote.Service)を継承したクラスによって定義します。

ゲストブックアプリケーションのチュートリアルで、
ゲストブックの挨拶文は、guestbook.Greetingクラスによって、データストアに保存しました。

Postサービスも、投稿のデータストアへの保存にGreetingクラスを使用することにします。

import datetime
from protorpc import message_types
from protorpc import remote
import guestbook
class PostService(remote.Service):
  @remote.method(Note, message_types.VoidMessage)
  def post_note(self, request):
    if request.when:
      when = datetime.datetime.utcfromtimestamp(request.when)
    else:
      when = datetime.datetime.now()
    note = guestbook.Greeting(content=request.text, date=when)
    note.put()
    return message_types.VoidMessage()

「method」デコレータ(@remote.method)は、2つのパラメータを取ります。
最初のパラメータは、リクエストのデータ型で、
2つ目のパラメータは、レスポンスのデータ型です。

ノートの投稿を受け付けるために、上記の「post_note」メソッドはNoteクラス(メッセージ)のインスタンスをリクエストとして受け取ります。

レスポンスには、「VoidMessage」(protorpc.message_types.VoidMessage)を指定していますが、
これはProtoRPCの組み込み型で、フィールドを持たないメッセージを意味します。

つまり、「post_note」メソッドは、呼び出し側に意味のあるデータを返しません。
エラーが発生しない限り、呼び出し側では、投稿は成功した、と見なします。

Note.whenは、必須フィールドではないので、呼び出し側がセットしているとは限りません。
セットしていない場合、whenにはNoneがセットされています。

「post_note」メソッドは、Noteにタイムスタンプが設定されていない場合、現在時刻を指定したものと見なします。

レスポンスメッセージは、リモートメソッドによってインスタンス化され、戻り値として使われます。

0 件のコメント:

コメントを投稿