2013-03-20 4 views
2

Замечание о контроле точки в конечной точке Cloud для меня кажется простым. Если у меня есть класс ответное сообщениеОконечная точка Google для облаков RequestMessage с несколькими разрешениями полей

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?

ответ

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' 
+1

Так мой класс 'FoodieRequestMessage' хорошим так оно и есть? Я видел, как люди использовали такие вещи, как 'messages.EnumField'. Я подумал, что нужно было как-то сказать «endpoints» api, где queryparameter/pathparameter установить, скажем, 'sit_table'. –

+0

Это нормально, как есть. Вы можете использовать 'EnumField', если у вас есть использование для перечислений, но это не меняет порядок обработки полей. – bossylobster