在thrift IDL中,服务响应可以是列表还是映射?
因为,通常我看到它是一些结构或一些原始类型,如string,double等。
另外,我可以验证的来源是什么?还请提及来源。
答案 0 :(得分:2)
当然可以:
service FooBar {
list<double> Foobarizer()
}
完全合法。
那么为什么人们会使用结构呢?好吧,它使API可扩展。这与所谓的"soft versioning"有关。
考虑您要添加另一个标志,以提供一些有价值的附加信息。我们如何将其添加到响应中?只有一个列表,你就会迷失方向,因为它会变成像
这样的东西struct FoobarizerReturn {
1: list<double> data
2: bool theValuableInfo // added in V2
}
service FooBar {
//list<double> Foobarizer()
FoobarizerReturn Foobarizer()
}
基本上会破坏旧客户端的API。 为了保持兼容性,您必须改变您的IDL,如下所示:
service FooBar {
/** V1 deprecated */
list<double> Foobarizer()
/** V2 use this now */
FoobarizerReturn FoobarizerV2()
}
至少有三个缺点:
因此,最前向兼容的解决方案是从一开始就使用结构,稍后可以根据需要轻松扩展,而不会破坏兼容性。
struct FoobarizerReturn {
1: list<double> data
// more data to come later
}
service FooBar {
FoobarizerReturn Foobarizer()
}