具有多个服务类的云端点

时间:2013-04-23 05:16:53

标签: python google-app-engine google-cloud-endpoints

我开始使用Google Cloud Endpoints,并且在指定多个服务类时遇到问题。知道如何让这个工作吗?

ApiConfigurationError: Attempting to implement service myservice, version v1, with multiple classes that aren't compatible. See docstring for api() for examples how to implement a multi-class API.

这就是我创建端点服务器的方式。

AVAILABLE_SERVICES = [
  FirstService,
  SecondService
]

app = endpoints.api_server(AVAILABLE_SERVICES)

对于我正在做的每个服务类:

@endpoints.api(name='myservice', version='v1', description='MyService API')
class FirstService(remote.Service):
...

@endpoints.api(name='myservice', version='v1', description='MyService API')
class SecondService(remote.Service):
...

这些中的每一个都完美地分开工作,但我不确定如何在组合它们时让它们工作。

非常感谢。

5 个答案:

答案 0 :(得分:6)

正确的方法是创建api对象并使用collection

api_root = endpoints.api(name='myservice', version='v1', description='MyService API')

@api_root.collection(resource_name='first')
class FirstService(remote.Service):
  ...


@api_root.collection(resource_name='second')
class SecondService(remote.Service):
  ...

其中资源名称将插入方法名称前面,以便您可以使用

  @endpoints.method(name='method', ...)
  def MyMethod(self, request):
    ...

而不是

  @endpoints.method(name='first.method', ...)
  def MyMethod(self, request):
    ...

将其放入API服务器:

api_root对象相当于用remote.Service修饰的endpoints.api类,因此您只需将其包含在endpoints.api_server列表中即可。例如:

application = endpoints.api_server([api_root, ...])

答案 1 :(得分:2)

如果我没有弄错,你应该为每项服务指定不同的名称,这样你就可以访问两者,每一项都有特定的“地址”。

@endpoints.api(name='myservice_one', version='v1', description='MyService One API')
class FirstService(remote.Service):
...

@endpoints.api(name='myservice_two', version='v1', description='MyService Two API')
class SecondService(remote.Service):
...

答案 2 :(得分:1)

我成功地部署了在两个类中实现的单个api。您可以尝试使用以下代码段(几乎直接来自Google documentation):

an_api = endpoints.api(name='library', version='v1.0')

@an_api.api_class(resource_name='shelves')
class Shelves(remote.Service):
...

@an_api.api_class(resource_name='books', path='books')
class Books(remote.Service):
...

APPLICATION = endpoints.api_server([an_api],
                               restricted=False)

答案 3 :(得分:0)

对于本地开发我正在使用临时解决方法,即禁用异常(我知道我知道......)

在第97行google_appengine/google/appengine/ext/endpoints/api_backend_service.py的sdk中:

        elif service_class != method_class:
          pass
#          raise api_config.ApiConfigurationError(
#              'SPI registered with multiple classes within one '
#              'configuration (%s and %s).  Each call to register_spi should '
#              'only contain the methods from a single class.  Call '
#              'repeatedly for multiple classes.' % (service_class,
#                                                    method_class))
    if service_class is not None:

结合我正在使用构造:

application = endpoints.api_server([FirstService, SecondService, ...])

同样,这在生产中不起作用,你会在那里得到同样的例外。希望这个答案将在未来的修复中废弃。

确认它已经过时(针对1.8.2进行测试)。

答案 4 :(得分:0)

如果是Java ......

https://developers.google.com/appengine/docs/java/endpoints/multiclass

再简单不过了。