google-app-engine - 具有多个响应消息的谷歌云端点方法

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

我有一个 google 可以指定的方法,我需要能够返回 MaleResponseMessageFemaleResponseMessage。有没有办法指定,比如用

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

当然可以选择声明一个 super 消息类,比如 PersonResponseMessage 来包装 MaleResponseMessageFemaleResponseMessage。但是有没有类似于上面代码片段的东西?

编辑:

在尝试实现我自己的建议时,我遇到了困难。这两种消息类型唯一的共同点是请求:PersonRequest 的请求字段完全相同(带有额外的 bool 值 female=true/false)。 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)

最佳答案

不幸的是没有。您只能有一个响应和一个请求模式;这是因为它们已在 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 是创建对应于 male 和 female 的 PersonMessage 实例的方法。

关于google-app-engine - 具有多个响应消息的谷歌云端点方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15529249/

相关文章:

linux - Python DBus 返回空列表

java - 如何在 appengine java 应用程序中创建包含谷歌云存储对象的 zip 存档?

java - 下载 Google App Engine 数据库

java - 如何将后端模块类导入android studio中的应用程序模块

deployment - 无法使用kubectl删除pod <pod>

java - 在 GAE 中创建 Google Cloud Endpoint 时出现项目错误 (Eclipse)

objective-c - 当 POST 数据具有多行时,Google Cloud Endpoints 会出错

java - 嵌入式数组内的对象化嵌入式数组无法持久存在

python - 艰难地学习 Python 练习 48 帮助

python - python 中的映射函数在解包值时抛出错误