谷歌云端点方法与多个响应消息

时间:2013-03-20 16:27:46

标签: google-app-engine python-2.7 google-cloud-endpoints

我有一个google can enpoint方法,我需要能够返回MaleResponseMessageFemaleResponseMessage。有没有办法指定,如

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

当然可以选择声明超级邮件类,例如PersonResponseMessage来包装MaleResponseMessageFemaleResponseMessage。但是有什么类似于上面的片段吗?

编辑:

试图实施我自己的建议,我陷入困境。两种消息类型的唯一共同点是请求:female=true/false的完全相同的请求字段(带有额外的布尔PersonRequest)。 MaleResponseMessageFemaleResponseMessage没有共同的字段。所以我使用一种端点方法,正如@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)

我不确定要检查???的内容。首先,我考虑过isinstancetype。但是我该怎么做?以下是否有效?

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

2 个答案:

答案 0 :(得分: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.')

其中male_responsefemale_response是创建与男性和女性相对应的PersonMessage实例的方法。

答案 1 :(得分:2)

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