여러 클래스로 구현된 API 만들기

이 페이지에서는 코드를 데코레이션하여 여러 클래스로 구현된 API를 생성하는 방법을 설명합니다. 클래스 하나만 사용하여 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의 각 클래스에 대해 동일한 이름을 사용하는 한, api_collection를 원하는 이름으로 바꿉니다. 위 스니펫에 표시된 것처럼 API의 각 클래스 앞에 데코레이터를 두어야 합니다.

resource_name 인수 정보

api_class의 선택사항인 resource_name 인수는 API에 노출하려는 클래스의 이름입니다. API 탐색기에도 이 이름이 표시되며, 클래스에 노출된 모든 메서드 앞에 추가됩니다.

path 인수 정보

api_class의 선택사항인 path 인수는 URL에서 클래스 메서드가 표시되는 상대 위치를 지정합니다. 앞의 예시에서 Shelves 클래스에 path가 지정되지 않았으므로 루트 /_ah/api/library/v1 아래에서 해당 메서드에 액세스할 수 있습니다. 예를 들어 /_ah/api/library/v1/list 경로에서 list 메서드에 액세스할 수 있습니다.

클래스에 path 인수를 지정하면 지정된 경로가 루트에 추가됩니다. 앞의 예시에서 Books 클래스에 path 인수 books가 지정되었으므로 /_ah/api/library/v1/books 아래에서 해당 메서드에 액세스할 수 있습니다. 예를 들어 /_ah/api/library/v1/books/best_sellers_list 경로에서 best_sellers_list 메서드에 액세스할 수 있습니다.

메서드의 경우 path 인수는 선택사항입니다. path를 지정하지 않으면 메서드 이름이 사용됩니다. 메서드에 지정된 경로는 클래스 경로에 추가됩니다. 위 예시에서는 bookmarkget_bookmark 메서드의 path로 지정되었습니다. /_ah/api/library/v1/books/bookmark 경로에서 get_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])

다음 단계