私はここにいます。私はいくつかのテストを行い、この解決策を見つけました(メソッドを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
。この最後の編集はあまりきれいに見えませんが (実際にはそうではありません)、クエリは機能します。
それでも、私はこのソリューションに本当に満足していません。