5

我有一个谷歌可以指定我需要能够返回 aMaleResponseMessage或 a 的方法FemaleResponseMessage。有没有办法指定例如

@endpoints.method(message_types.VoidMessage, [MaleResponseMessage, FemaleResponseMessage])

当然可以选择声明一个超级消息类,例如,PersonResponseMessage包装MaleResponseMessageor 或FemaleResponseMessage. 但是有什么类似于上面的片段吗?

编辑:

试图实施我自己的建议,我被卡住了。这两种消息类型的唯一共同点是请求:female=true/false对于PersonRequest. theMaleResponseMessage和 theFemaleResponseMessage没有共同的领域。所以我使用一种端点方法,正如@bossylobster 所示,我在其中检查

if request.female : # request.female == True
    return get_female(etc, etc)
else: # request.female == False // implies male
    return get_male(etc,etc)

对于回应,我需要类似的东西

class PersonResponse(messages.Message):
  if ??? :
     item = messages.MessageField(MaleResponseMessage,1)
  else:
      item = messages.MessageField(FemaleResponseMessage,1)

我不确定要检查什么???。首先,我想到了isinstanceor type。但我该怎么做呢?下面的工作吗?

class PersonResponse(messages.Message):
  if type(Message()) == MaleResponseMessage :
     item = messages.MessageField(MaleResponseMessage,1)
  else:
      item = messages.MessageField(FemaleResponseMessage,1)
4

2 回答 2

3

抱歉不行。你只能有一个响应和一个请求模式;这是因为它们是在 Google 的 API 基础架构中注册的,并且具有严格的模式是提供请求的速度和效率的原因。

您最好的选择是将每个男性和女性所需的字段组合到一个模型类中并进行自己的验证。

一个可能的解决方案可能看起来像

from protorpc import messages

class Gender(messages.Enum):
    MALE = 0
    FEMALE = 1

class GenderRequest(messages.Enum):
    gender = messages.EnumField(Gender, 1, required=True)

class PersonResponse(messages.Message):
    gender = messages.EnumField(Gender, 1)
    # shared fields
    # female specific fields
    # male specific fields

然后用你的实际方法

    @endpoints.method(GenderRequest, PersonMessage, ...)
    def my_method(self, request):
      if request.gender == Gender.MALE:
          return male_response(request)
      elif request.gender == Gender.FEMALE:
          return female_response(request)
      else:
          # This should never occur since gender is required
          raise endpoints.BadRequestException('Gender not set.')

wheremale_responsefemale_response是创建PersonMessage对应于男性和女性的实例的方法。

于 2013-03-20T16:43:52.410 回答
2

您可以使用两种不同的端点方法。

于 2013-03-21T22:08:17.040 回答