过去几天我一直在玩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能够解决之前的错误。
答案 0 :(得分:1)
预计404
。 id
属性的“神奇之处”在于它调用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
。