gpt4 book ai didi

python - Google App Engine Api 和端点版本控制

转载 作者:太空宇宙 更新时间:2023-11-03 11:02:52 24 4
gpt4 key购买 nike

我在寻找处理多个的正确方法时遇到了一些麻烦我的应用程序中的 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: 不要使用方法装饰器
在服务 MyBetterService 上重载远程方法 do_stuff 时。

有没有办法在下一版本的 API 中重写方法?

重写的方法可以接受其他请求参数吗?

是否可以在现有的 api 中只添加一个不同版本的端点?

最佳答案

端点服务类是这样写的,一旦你定义了一个公共(public)接口(interface)方法,你就不能在子类中改变它们。通常,您不应将类的新 API 版本定义为子类,除非它是父类(super class)接口(interface)的精确超集。

在新版本是超集的情况下,您可以使用重新定义接口(interface)方法,这将自动继承父方法的属性。例如:

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 相同,并且具有独立的服务类定义。将 API 真正视为一个接口(interface)。虽然两个类不应共享具有通用 API 方法定义的基类,但这并不意味着两个类现在可以共享一组通用的功能类。

当我构建服务时,我将 API 版本实现为单独的类,即使我不得不复制许多方法签名。然而,在服务之下,我实现了一个对象系统,这些对象完全独立于接口(interface)和 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 负责在服务接口(interface)和实际的底层系统之间编码信息,而不是实际的实现。

虽然为每个新实现显式复制每个方法似乎需要大量工作,但实际上它通常只是整体服务应该完成的一小部分。

关于python - Google App Engine Api 和端点版本控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27959530/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com