我在這裏。我做了一些測試,我發現這個解決方案(有在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
。這最後的編輯看起來不太乾淨(實際上不是),但查詢起作用。
不過,我對這個解決方案並不滿意。