我有一个google can enpoint方法,我需要能够返回MaleResponseMessage
或FemaleResponseMessage
。有没有办法指定,如
@endpoints.method(message_types.VoidMessage, [MaleResponseMessage, FemaleResponseMessage])
当然可以选择声明超级邮件类,例如PersonResponseMessage
来包装MaleResponseMessage
或FemaleResponseMessage
。但是有什么类似于上面的片段吗?
编辑:
试图实施我自己的建议,我陷入困境。两种消息类型的唯一共同点是请求:female=true/false
的完全相同的请求字段(带有额外的布尔PersonRequest
)。 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)
答案 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_response
和female_response
是创建与男性和女性相对应的PersonMessage
实例的方法。
答案 1 :(得分:2)
您可以使用两种不同的端点方法。