我来了 我做了一些测试,我找到了这个解决方案(在club/{id}/members
我为标准端点创建了一个资源容器。消息复制了query_method
作为输入的内容。
ID_RESOURCE_PAGE = endpoints.ResourceContainer(
message_types.VoidMessage,
id=messages.IntegerField(1, variant=messages.Variant.INT64),
cursor=messages.StringField(2, variant=messages.Variant.STRING, required=False, default="1"),
limit=messages.IntegerField(3, variant=messages.Variant.INT32, required=False, default=10)
)
然后我创建了一个@endopint.method
这样的标准
@endpoints.method(ID_RESOURCE_PAGE, User.ProtoCollection(),
path='club/{id}/members',
http_method='GET',
name='club.members')
def club_memebers(self, request):
# check if user has ownership
club = Club.get_by_id(request.id)
page_size = request.limit
# convert the cursors, usually it's a token, here is page number.
page = int(request.cursor)
# internal check, just in case.
if (page is None or page < 0):
raise endpoints.BadRequestException(message="Page field must be a positive integer")
if (page_size is None or page_size < 0 or page > 100):
raise endpoints.BadRequestException(
message="Page_size field must be a positive integer and cannot be greater than 100")
# compute start and end users to retrive
start = (page - 1) * page_size
end = page * page_size
# crop the list
res_list = club.membersUser[start:end]
# create the object
ret = User.ToMessageCollection(res_list)
# it's probably another page
if (len(res_list) == page_size):
# add next page as nextPageToken, not the best but the easy way
ret.nextPageToken = str(page + 1)
return ret
需要注意的是,我曾经User.ProtoCollection()
让集合自动序列化,并且我将页码伪造为ret.nextPageToken
. 最后一次编辑看起来不太干净(实际上不是),但查询有效。
不过,我对这个解决方案并不满意。