2

クラウド エンドポイントの ResponseMessage は、私には簡単に思えます。応答メッセージ クラスがある場合

class FoodieResponseMessage(messages.Message):
  name = messages.StringField(1)
  fav_food = messages.StringField(2)
  city = messages.StringField(3)

それを呼び出すのは簡単です

FoodieResponseMessage(name="A", fav_food="B", city="C")

しかし、RequestMessage複数のフィールドがある場合はどうでしょうか? サービス エンドポイント メソッドから得られるのはrequestオブジェクトだけです。どのフィールドがどこにあるのかを知るにはどうすればよいですか?

class FoodieRequestMessage(messages.Message):
  name = messages.StringField(1)
  id = messages.StringField(2)
  sitting_table = messages.StringField(3)

 @endpoints.method(FoodieRequestMessage, FoodieResponseMessage)
 def process(self, request):
   name = request.name
   id = request.id
   table = request.sitting_table

要求はどのようにフィールドと一致するので、私がそうするsitting_tableときにユーザーのものを取得することはありませんrequest.nameか?

4

1 に答える 1

2

メソッドは API クラスのメンバーである必要があります。

from protorpc import remote

class FoodieAPI(remote.Service):

  @endpoints.method(FoodieRequestMessage, FoodieResponseMessage)
  def process(self, request):
    # Handle request

processサブクラスのメンバーであるため、によってremote.Service作成される実際のハンドラー

application = endpoints.api_server([FoodieApi])

は、JSON を指定したネイティブ メッセージ リクエスト クラスに変換する方法を知っており ( FoodieRequestMessage)、指定したレスポンス クラスのインスタンスを返すことも期待しています ( FoodieResponseMessage)。これも JSON に変換できるためです。

例えば:

>>> import json
>>> from protorpc import protojson
>>>
>>> payload = json.dumps({
>>>     'name': 'Dan', 
>>>     'fav_food': 'Mac and Cheese', 
>>>     'city': 'San Francisco'
>>> })
>>> message = protojson.decode_message(FoodieResponseMessage, payload)
>>> message
<FoodieResponseMessage
 name: u'Dan'
 fav_food: u'Mac and Cheese'
 city: u'San Francisco'>

したがって、リクエストのペイロードが

{"city": "San Francisco", "fav_food": "Mac and Cheese", "name": "Dan"}

メソッド内のrequestオブジェクトは

>>> message.name
u'Dan'
>>> message.fav_food
u'Mac and Cheese'
>>> message.city
u'San Francisco'
于 2013-03-21T17:40:52.247 に答える