尝试检索单个实体时出错

时间:2013-05-20 10:07:37

标签: google-cloud-endpoints endpoints-proto-datastore

过去几天我一直在玩Google Cloud Endpoints(目的是将其与AngularJS联系起来),当我尝试从我的数据存储中检索单个实体时遇到了一些麻烦。

我的ndb模型设置为:

class Ingredients(EndpointsModel):
    ingredient = ndb.StringProperty()

class Recipe(EndpointsModel):
    title = ndb.StringProperty(required=True)
    description = ndb.StringProperty(required=True)
    ingredients = ndb.StructuredProperty(Ingredients, repeated=True)
    instructions = ndb.StringProperty(required=True)

以下是我通过'title'定义检索实体的API方法:

    @Recipe.method(request_fields=('title',), path='recipe/{title}',
                   http_method='GET', name='recipe.get')
    def get_recipe(self, recipe):
        if not recipe.from_datastore:
            raise endpoints.NotFoundException('Recipe not found.')
        return recipe   

如果我使用'id'EndpointsModel提供的辅助方法)代替'title'请求字段,API方法可以正常工作。但是,当我使用'title'时,我正在

  

404 Not Found

     

{“error_message”:“未找到食谱。”,“州”:“APPLICATION_ERROR”}

任何人都可以指出我在哪里遗失某些东西吗?

注意:查看评论。用于阅读的问题中的错误

  

400错误请求

     

{“error_message”:“解析ProtoRPC请求时出错(无法解析请求内容:Message RecipeProto_title缺少必填字段标题)”,   “州”:“REQUEST_ERROR”}

但是@sentiki能够解决之前的错误。

1 个答案:

答案 0 :(得分:1)

预计404id属性的“神奇之处”在于它调用UpdateFromKey

此方法尝试根据请求在实体上设置ndb.Key,然后尝试检索使用该密钥存储的实体。如果实体存在,则将数据存储中的值复制到从请求解析的实体,然后_from_datastore属性为set to True

使用request_fields=('title',),您有一个简单的数据属性而不是EndpointsAliasProperty,因此只设置了值。因此,_from_datastore永远不会被设置并且您的支票

    if not recipe.from_datastore:
        raise endpoints.NotFoundException('Recipe not found.')

按预期抛出endpoints.NotFoundException