Thrift接⼝描述语⾔(IDL)语法说明
1. 本⽂档⼤部分内容翻译⾃⽂章:。
1.1 主要特性:
IDL  名字空间 / 语⾔名字空间 /
基本类型 / 常量&枚举 / 容器 /
结构体 / 结构体的演化(升级) /
服务 / 服务继承 /
异步调⽤ / ⾃定义异常 /
1.2  不⽀持的特性
不⽀持多态 / 重载.
没有异构容器: 容器中元素的类型必须⼀样.
不能返回 null.
2. 语法参考
2.1 Types
Thrift类型系统包括预定义基本类型,⽤户⾃定义结构体,容器类型,异常和服务定义
(1) 基本类型
1 2 3 4 5 6 7 8 9 10 11 12 13bool :布尔类型( true  or value),占⼀个字节byte:有符号字节
double :64位浮点数
string:未知编码或者⼆进制的字符串
注意,thrift不⽀持⽆符号整型,因为很多⽬标语⾔不存在⽆符号整型(如java)。
(2) 容器类型
Thrift容器与类型密切相关,它与当前流⾏编程语⾔提供的容器类型相对应,采⽤java泛型风格表⽰的。Thrift提供了3种容器类型:List<t1>:⼀系列t1类型的元素组成的有序表,元素可以重复
Set<t1>:⼀系列t1类型的元素组成的⽆序表,元素唯⼀
Map<t1,t2>:key/value对(key的类型是t1且key唯⼀,value类型是t2)。
容器中的元素类型可以是除了service意外的任何合法thrift类型(包括结构体和异常)。
(3)  结构体和异常
Thrift结构体在概念上同C语⾔结构体类型—-⼀种将相关属性聚集(封装)在⼀起的⽅式。在⾯向对象语⾔中,thrift结构体被转换成类。
异常在语法和功能上类似于结构体,只不过异常使⽤关键字exception⽽不是struct关键字声明。但它在语义上不同于结构体—当定义⼀个RPC服务时,开发者可能需要声明⼀个远程⽅法抛出⼀个异常。
结构体和异常的声明将在下⼀节介绍。
(4)  服务
服务的定义⽅法在语法上等同于⾯向对象语⾔中定义接⼝。Thrift编译器会产⽣实现这些接⼝的client和server桩。具体参见下⼀节。(5)  类型定义
Thrift⽀持C/C++风格的typedef:
1 2 3typedef  i32 MyInteger  \\a typedef  Tweet ReTweet  \\b
说明:
a.  末尾没有逗号
b.  struct可以使⽤typedef
2.2  枚举类型
可以像C/C++那样定义枚举类型,如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24enum  TweetType {
TWEET,        //a
RETWEET = 2,  //b
DM = 0xa,  //c
REPLY
}        //d
struct  Tweet {
1: required i32 userId;
2: required string userName;
3: required string text;
4: optional Location loc;
5: optional TweetType tweetType = TweetType.TWEET  // e
25 26 2716: optional string language =  "english" }
说明:
a.  编译器默认从0开始赋值
b.  可以赋予某个常量某个整数
c.  允许常量是⼗六进制整数
d.  末尾没有逗号
e.  给常量赋缺省值时,使⽤常量的全称
注意,不同于protocol buffer,thrift不⽀持枚举类嵌套,枚举常量必须是32位的正整数2.3  注释
Thrfit⽀持shell注释风格,C/C++语⾔中单⾏或者多⾏注释风格
1 2 3 4 5 6 7 8 9 10 11# This is a valid comment.
/*
* This is a multi-line comment.
* Just like in C.
*/
/
/ C++/Java style single-line comments work just as well.
2.4  命名空间
Thrift中的命名空间同C++中的namespace和java中的package类似,它们均提供了⼀种组织(隔离)代码的⽅式。因为每种语⾔均有⾃⼰的命名空间定义⽅式(如python中有module),thrift允许开发者针对特定语⾔定义namespace:
1 2 3namespace  ample.project  // a namespace  ample.project  // b
说明:
a.转化成namespace com { namespace example { namespace project {
b.转换成ample.project
2.5  ⽂件包含
Thrift允许thrift⽂件包含,⽤户需要使⽤thrift⽂件名作为前缀访问被包含的对象,如:
1 2 3 4 5 6 7 8 9include  "tweet.thrift"            // a ...
struct  TweetSearchResult { 1: list<tweet.Tweet> tweets;  // b }
说明:
a.  thrift⽂件名要⽤双引号包含,末尾没有逗号或者分号
b.注意tweet前缀
2.6  常量
Thrift允许⽤户定义常量,复杂的类型和结构体可使⽤JSON形式表⽰。
1 2 3const  i32 INT_CONST = 1234;    // a
const  map<string,string> MAP_CONST = { "hello" :  "world" ,  "goodnight" :  "moon" }
说明:
a.分号是可选的,可有可⽆;⽀持⼗六进制赋值。
2.7  定义结构体
结构体由⼀系列域组成,每个域有唯⼀整数标识符,类型,名字和可选的缺省参数组成。如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21struct  Tweet {
1: required i32 userId;                  // a
2: required string userName;              // b 3: required string text;
4: optional Location loc;                // c
16: optional string language =  "english"  // d }
struct  Location {                            // e
write的返回值
1: required  double  latitude;
2: required  double  longitude;
}
说明:
a.  每个域有⼀个唯⼀的,正整数标识符
b.  每个域可以标识为required或者optional(也可以不注明, 默认 optional)
c.  结构体可以包含其他结构体
d.  域可以有缺省值
e.  ⼀个thrift中可定义多个结构体,并存在引⽤关系
规范的struct定义中的每个域均会使⽤required或者optional关键字进⾏标识。如果required标识的域没有赋值,thrift将提⽰错误。如果optional标识的域没有赋值,该域将不会被序列化传输。如果某个optional标识域有缺省值⽽⽤户没有重新赋值,则该域的值⼀直为缺省值。
与service不同,结构体不⽀持继承,即,⼀个结构体不能继承另⼀个结构体。
2.8  定义服务
在流⾏的序列化/反序列化框架(如protocol buffer)中,thrift是少有的提供多语⾔间RPC服务的框架。
Thrift编译器会根据选择的⽬标语⾔为server产⽣服务接⼝代码,为client产⽣桩代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20//“Twitter”与“{”之间需要有空格
service Twitter {
// ⽅法定义⽅式类似于C语⾔中的⽅式,它有⼀个返回值,⼀系列参数和可选的异常
// 列表. 注意,参数列表和异常列表定义⽅式与结构体中域定义⽅式⼀致.
void  ping(),                                    // a
bool  postTweet(1:Tweet tweet);                  // b
TweetSearchResult searchTweets(1:string query);  // c
// ”oneway”标识符表⽰client发出请求后不必等待回复(⾮阻塞)直接进⾏下⾯的操作,// ”oneway”⽅法的返回值必须是void
oneway  void  zip()                                // d
}
说明:
a.函数定义可以使⽤逗号或者分号标识结束
b.参数可以是基本类型或者结构体,参数是只读的(const),不可以作为返回值c.返回值可以是基本类型或者结构体
d.返回值可以是void
注意,函数中参数列表的定义⽅式与struct完全⼀样
Service⽀持继承,⼀个service可使⽤extends关键字继承另⼀个service
3.  产⽣代码

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。