複数のクラスを使用する API の作成

このページでは、複数のクラスで実装される API を作成するときにコードをどのようにデコレートするかを説明します。クラスを 1 つだけ使用して API を実装した場合は、API を作成するをご覧ください。 使用可能なすべてのデコレータについて詳しくは、デコレータをご覧ください。

api_collection = endpoints.api(name="library", version="v1.0")


@api_collection.api_class(resource_name="shelves")
class Shelves(remote.Service):
    @endpoints.method(Request, Response)
    def list(self, request):
        return Response()


@api_collection.api_class(resource_name="books", path="books")
class Books(remote.Service):
    @endpoints.method(Request, Response, path="bookmark")
    def get_bookmark(self, request):
        return Response()

    @endpoints.method(Request, Response)
    def best_sellers_list(self, request):
        return Response()

api_collection は任意の名前に置き換えます。ただし、同じ名前を API の各クラスに使用してください。前のスニペットのように、API の各クラス名の前にデコレータを付ける必要があります。

resource_name 引数について

api_classresource_name 引数は省略可能であり、API で公開するクラスの名前です。この名前は、API Explorer で表示され、そのクラスで公開されるすべてのメソッドの名前の先頭に付けられます。

path 引数について

api_classpath 引数は省略可能であり、URL でクラスメソッドが示される相対位置を指定します。前述の例では、クラス Shelvespath が指定されていないため、このクラスのメソッドは /_ah/api/library/v1 の下に存在し、ここでアクセスできます。たとえば、list メソッドにはパス /_ah/api/library/v1/list からアクセスできます。

クラスの path 引数を指定すると、指定されたパスがルートの末尾に付加されます。前述の例では、path 引数 books がクラス Books に関して指定されているため、このクラスのメソッドは /_ah/api/library/v1/books の下に存在し、ここでアクセスできます。たとえば、best_sellers_list メソッドにはパス /_ah/api/library/v1/books/best_sellers_list からアクセスできます。

path 引数は、メソッドで省略可能です。path を指定しないと、メソッド名が使用されます。メソッドに指定されたパスはすべて、クラスパスの末尾に付加されます。前述の例では、bookmarkget_bookmark メソッドの path として指定されています。get_bookmark メソッドにはパス /_ah/api/library/v1/books/bookmark からアクセスできます。

クラスの path 引数をオーバーライドするには、/ で始まるメソッド path 引数を指定します。たとえば、Books クラスの get_bookmark メソッドに次のパスがあるとします。

@endpoints.method(Request, Response, path='/bookmark')
def get_bookmark(self, request):
  return Response()

先頭のスラッシュにより、get_bookmark メソッドのパスが /_ah/api/library/v1/bookmark に変更されます。

マルチクラス API の提供

API サーバーを作成する endpoints.api_server コードの中で、api_class コレクションに割り当てた名前を指定します。たとえば、コレクションの名前が api_collection ならば、サーバーを次のようにして作成します。

api = endpoints.api_server([api_collection])

次のステップ