我开始使用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):
...
这些中的每一个都完美地分开工作,但我不确定如何在组合它们时让它们工作。
非常感谢。
答案 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_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
再简单不过了。