【问题标题】:Google endpoints谷歌端点
【发布时间】:2014-10-07 23:39:36
【问题描述】:

我有一个关于从 Python 中的 Endpoints 模型方法中检索查询的具体问题。

    # DataPointModel GET LIST api method
    @DataPointModel.query_method(query_fields=('user_key', ), # Fields from which the   method is querying from
                                 path='datapoint/list/{user_key}', # REST api parameters
                                 name='datapoint.list_get_by_user_key') # Metod name
    def datapoint_list_get_by_user_key(self, query):
        '''
        Returns the DataPointModel object model list by its user KEY
        '''
        return query

我在 Android (Java) 上有客户端。 问题是这会返回一个 DataPointModelCollection ,它不包含 列表(dataPointsCollection.getDatapointList() 这是空的)。

DataPointModelCollection 包含“项目”,因此它包含正确的对象, 如果打印 toString() 并显示为 JSON。然而问题依然存在,因为 我想将检索到的 DataPointModelCollection 映射为 Java 对象 DataPointModel 的列表。

我真的很想听听对此的一些见解。让我烦恼的是,我可以上传一个 DataPointModelCollection 我为它设置一个列表......但它只是 反过来不行吗?

【问题讨论】:

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


    【解决方案1】:

    编辑 2:抱歉,我还是没明白你在问什么。这是实际的答案 - 仅出于兴趣阅读其他部分。

    This docs page 解释了如何提取客户端 Android“-Collection”生成的类中的实体。您需要调用.getItems(),而不是像“getDatapointList()”这样的命名函数。在“关于支持的返回类型”下:

    可序列化类型列表 实际上,Endpoints 生成的是一个新的“集合”JSON 类,它与其他所有客户端都相似 模型类。例如,如果您的模型中有一个对象是 由 Lobster.java 表示,并且您想返回一个 List, 该库将有一个 LobsterCollection.java。您可以检索 通过调用 getItems() 列出您客户端中的龙虾列表。


    编辑:非常抱歉,我承认我略读了你的问题并且我的大脑解析了 java.util. Python 先回答:

    Python

    您应该熟悉Message 对象及其Fields。你不能简单地返回一个 python 对象。消息对象包含多个字段值,用于将对象转换为 JSON 对象,以便通过 API HTTP 请求进行传输。

    要从您的 Endpoints 函数返回一个 Message 对象,该函数具有多个 Message 对象的列表(例如,每个对象都包装一个 StringField 和一个 DateTimeField),定义此返回类型的 Message 类应该有一个 MessageField in它允许您将消息(例如我们创建的包含 StringField 和 DateTimeField 的类型)放入其他消息(我们的返回类型)中。另外,在这个字段上,你需要设置repeated=True,你可以在下面的sn-p中看到:

    # REPEATED IN MESSAGE FIELD IN ORDER CLASS
    class Lot(messages.Message):
        price = messages.IntegerField(1, required=True)
        quantity = messages.IntegerField(2, required=True)
    
    class Order(messages.Message):
        symbol = messages.StringField(1, required=True)
        total_quantity = messages.IntegerField(2, required=True)
        trade_type = messages.EnumField(TradeType, 3, required=True)
        lots = messages.MessageField(Lot, 4, repeated=True) # REPEATED FIELD!
        limit = messages.IntegerField(5)
    

    JAVA

    您需要实现一个包含集合的包装类。 See this question

    阅读here 了解有关参数和返回类型的更多信息。

    请参阅here 以获得一个有趣的答案,该答案解释了如何添加多个实体类型作为参数(短篇小说:不能做实体类型的多个参数,不能做实体类型的集合,需要使用包装器包含两个实体的实体)

    【讨论】:

    【解决方案2】:

    我已经想通了 - DataPointModelCollection 应该有一个不同的名称,因为端点在某种程度上为每个模型集合都有一个默认的保留名称。所以我只是将模型的名称更改为 DataPointModelInsertCollection

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-09
      • 2019-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-27
      • 2014-07-05
      • 1970-01-01
      相关资源
      最近更新 更多