Google App Engine Api 和端点版本控制
Google App Engine Api and Endpoints versioning
我在寻找处理多个的正确方法时遇到了一些麻烦
我的应用程序中 remote.Service api 的版本。
class MyService(Service):
@endpoints.method(
endpoints.ResourceContainer(
something=protorpc.messages.StringField(1, required=True),
),
message_types.VoidMessage,
)
def do_stuff(self, request):
... implement do_stuff ...
class MyBetterService(MyService):
@endpoints.method(
endpoints.ResourceContainer(
some_other_name=protorpc.messages.StringField(1, required=True),
),
message_types.VoidMessage,
)
def do_stuff(self, request):
# ...other way of doing stuff
return message_types.VoidMessage()
尝试创建库时出现此错误:
protorpc.remote.ServiceDefinitionError: Do not use method decorator
when overloading remote method do_stuff on service MyBetterService.
下一个版本 API 是否有覆盖方法的方法?
覆盖的方法可以接受其他请求参数吗?
是否可以在现有 api 的基础上只添加一个不同版本的端点?
端点服务 classes 是这样写的,一旦你定义了一个 public 接口方法,你就不能在子 classes 中改变它们。通常你不应该将 class 的新 API 版本定义为子 class 除非它是超级 class.[=13 的接口的精确超集=]
在新版本是超集的情况下,您可以使用重新定义接口方法,它会自动继承父方法的属性。例如:
class MyService(Service):
@endpoints.method(
endpoints.ResourceContainer(
something=protorpc.messages.StringField(1, required=True),
),
message_types.VoidMessage,
)
def do_stuff(self, request):
... implement do_stuff ...
class MyBetterService(MyService):
def do_stuff(self, request):
# ...other way of doing stuff
return message_types.VoidMessage()
@endpoints.method(
endpoints.ResourceContainer(
something=protorpc.messages.IntegerField(1, required=True),
),
message_types.VoidMessage,
)
def do_more_stuff(self, request):
... implement do_more_stuff ...
无法更改 do_stuff()
的输入类型。
在实践中,新的 API 版本应该被视为与新的 API 相同,并且具有独立的服务 class 定义。将 API 真正视为一个接口。虽然两个 classes 不应该与共同的 API 方法定义共享一个基础 class,但这并不意味着两个 classes 现在可以共享一组共同的函数 classes.
当我构建服务时,我将 API 版本实现为单独的 classes,即使我不得不复制许多方法签名。然而,在该服务之下,我实现了一个对象系统,该系统完全独立于接口和 API 消息类型执行相同的操作。这允许两个 API 版本共享实现的重要部分。
例如:
from mysystem import MyImplementation
class MyService(Service):
@endpoints.method(
endpoints.ResourceContainer(
something=protorpc.messages.StringField(1, required=True),
),
message_types.VoidMessage,
)
def do_stuff(self, request):
MyImplementation.do_stuff(request.something)
class MyBetterService(Service):
@endpoints.method(
endpoints.ResourceContainer(
something=protorpc.messages.IntegerField(1, required=True),
),
message_types.VoidMessage,
)
def do_stuff(self, request):
MyImplementation.do_stuff(self.lookup_string(request.something))
在这个模型中,我认为 API 负责在服务接口和实际的底层系统之间编组信息,而不是实际的实现。
虽然为每个新实现显式复制每个方法看起来工作量很大,但实际上它通常只是整体服务应该完成的一小部分。
我在寻找处理多个的正确方法时遇到了一些麻烦 我的应用程序中 remote.Service api 的版本。
class MyService(Service):
@endpoints.method(
endpoints.ResourceContainer(
something=protorpc.messages.StringField(1, required=True),
),
message_types.VoidMessage,
)
def do_stuff(self, request):
... implement do_stuff ...
class MyBetterService(MyService):
@endpoints.method(
endpoints.ResourceContainer(
some_other_name=protorpc.messages.StringField(1, required=True),
),
message_types.VoidMessage,
)
def do_stuff(self, request):
# ...other way of doing stuff
return message_types.VoidMessage()
尝试创建库时出现此错误:
protorpc.remote.ServiceDefinitionError: Do not use method decorator
when overloading remote method do_stuff on service MyBetterService.
下一个版本 API 是否有覆盖方法的方法?
覆盖的方法可以接受其他请求参数吗?
是否可以在现有 api 的基础上只添加一个不同版本的端点?
端点服务 classes 是这样写的,一旦你定义了一个 public 接口方法,你就不能在子 classes 中改变它们。通常你不应该将 class 的新 API 版本定义为子 class 除非它是超级 class.[=13 的接口的精确超集=]
在新版本是超集的情况下,您可以使用重新定义接口方法,它会自动继承父方法的属性。例如:
class MyService(Service):
@endpoints.method(
endpoints.ResourceContainer(
something=protorpc.messages.StringField(1, required=True),
),
message_types.VoidMessage,
)
def do_stuff(self, request):
... implement do_stuff ...
class MyBetterService(MyService):
def do_stuff(self, request):
# ...other way of doing stuff
return message_types.VoidMessage()
@endpoints.method(
endpoints.ResourceContainer(
something=protorpc.messages.IntegerField(1, required=True),
),
message_types.VoidMessage,
)
def do_more_stuff(self, request):
... implement do_more_stuff ...
无法更改 do_stuff()
的输入类型。
在实践中,新的 API 版本应该被视为与新的 API 相同,并且具有独立的服务 class 定义。将 API 真正视为一个接口。虽然两个 classes 不应该与共同的 API 方法定义共享一个基础 class,但这并不意味着两个 classes 现在可以共享一组共同的函数 classes.
当我构建服务时,我将 API 版本实现为单独的 classes,即使我不得不复制许多方法签名。然而,在该服务之下,我实现了一个对象系统,该系统完全独立于接口和 API 消息类型执行相同的操作。这允许两个 API 版本共享实现的重要部分。
例如:
from mysystem import MyImplementation
class MyService(Service):
@endpoints.method(
endpoints.ResourceContainer(
something=protorpc.messages.StringField(1, required=True),
),
message_types.VoidMessage,
)
def do_stuff(self, request):
MyImplementation.do_stuff(request.something)
class MyBetterService(Service):
@endpoints.method(
endpoints.ResourceContainer(
something=protorpc.messages.IntegerField(1, required=True),
),
message_types.VoidMessage,
)
def do_stuff(self, request):
MyImplementation.do_stuff(self.lookup_string(request.something))
在这个模型中,我认为 API 负责在服务接口和实际的底层系统之间编组信息,而不是实际的实现。
虽然为每个新实现显式复制每个方法看起来工作量很大,但实际上它通常只是整体服务应该完成的一小部分。