我有一个 google 可以指定的方法,我需要能够返回 MaleResponseMessage
或 FemaleResponseMessage
。有没有办法指定,比如用
@endpoints.method(message_types.VoidMessage, [MaleResponseMessage, FemaleResponseMessage])
当然可以选择声明一个 super 消息类,比如 PersonResponseMessage
来包装 MaleResponseMessage
或 FemaleResponseMessage
。但是有没有类似于上面代码片段的东西?
编辑:
在尝试实现我自己的建议时,我遇到了困难。这两种消息类型唯一的共同点是请求:PersonRequest
的请求字段完全相同(带有额外的 bool 值 female=true/false
)。 MaleResponseMessage
和 FemaleResponseMessage
没有共同的字段。所以我使用一种端点方法,如@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)
我不确定要检查什么???
。首先,我想到了 isinstance
或 type
。但我该怎么做呢?下面的方法行得通吗?
class PersonResponse(messages.Message):
if type(Message()) == MaleResponseMessage :
item = messages.MessageField(MaleResponseMessage,1)
else:
item = messages.MessageField(FemaleResponseMessage,1)
最佳答案
不幸的是没有。您只能有一个响应和一个请求模式;这是因为它们已在 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_response
和 female_response
是创建对应于 male 和 female 的 PersonMessage
实例的方法。
关于google-app-engine - 具有多个响应消息的谷歌云端点方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15529249/