谷歌终端

时间:2014-10-07 23:39:37

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

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

    # 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 List(dataPointsCollection.getDatapointList()这是null)。

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

我真的很想听听有关这方面的一些见解。令我感到困扰的是,我可以上传一个DataPointModelCollection,我在其中设置了一个List ......但它只是 反过来不起作用吗?

2 个答案:

答案 0 :(得分:1)

编辑2 :抱歉,我仍然不明白你在问什么。这是实际的答案 - 只阅读其他部分的兴趣。

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

  

可序列化类型列表实际上,Endpoints生成的是一个新的“Collection”JSON类,与其他客户端类似   模特课。例如,如果模型中有一个对象,那么   由Lobster.java表示,并且您想要返回List,   该库将有一个LobsterCollection.java。你可以检索   通过调用getItems()来获取客户端中的龙虾列表。


编辑:非常抱歉,我承认我浏览了你的问题,我的大脑解析了java。 Python首先回答:

<强> PYTHON

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

要从Endpoints函数返回一个Message对象,该函数包含多个Message对象的列表(例如,每个对象包含一个StringField和一个DateTimeField),定义此返回类型的Message类应该具有{{3}在它中,它允许您将Messages(例如我们创建的包含StringField和DateTimeField的类型)放入其他Messages(我们的返回类型)中。此外,在此字段中,您需要设置repeated=True,如下面的代码段所示:

# 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

您需要实现包含集合的包装类。 MessageField

阅读See this question以获取有关参数和返回类型的更多信息。

请参阅here一个有趣的答案,解释如何添加多个实体类型作为参数(简短的故事:不能做多个实体类型的参数,不能做实体类型的集合,需要使用包含两个实体的包装器实体

答案 1 :(得分:0)

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