5

我开始使用 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):
...

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

非常感谢。

4

5 回答 5

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, ...])
于 2013-04-25T23:01:06.347 回答
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):
...
于 2013-04-23T10:22:02.550 回答
1

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

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)
于 2014-01-24T11:45:33.850 回答
0

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

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

        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 进行了测试)。

于 2013-05-13T22:32:23.987 回答
0

如果是Java...

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

云更不容易。

于 2013-11-06T03:24:49.923 回答