TQL(又称Taobao QL)是基于淘宝开放平台服务封装的一种查询语言调用方式,与标准REST化等模式一样,都是调用服务方式的一种变形,目的是希望能够通过使用方式的改变提高开发者开发效率,可维护性,降低性能损耗(减少http连接,调用次数等)。下面将会用具体的通过实际范例来展示使用场景。
同上所说,所有的TQL支持的服务都是开放平台已经开放的服务,因此可以参看开放平台API文档来构建TQL(http://open.taobao.com/doc/api_list.htm?id=102)。
1. 手机客户端或者页面查询数据,避免一个页面多次调用api,把所有需要查询的数据写在同一条ql中,用批量查询一次搞定。对于一个商品的诸多操作一次搞定,减少http链接,调用次数。
a) 用户登录并查询卖家商品信息
{select nick,sex,type from user}{select num_iid,titile from items.onsale}{…}
b) 全量更新库存并更新商品上架数量
{update item.quantity set quantity=31 where num_iid=10000569}{update taobao.item.update.listing set num=155 where num_iid=10000569}
2. 当查询一个api无法获得你想要的数据,必须多次请求TOP,使用tql避免多次查询麻烦,如:
查询一个用户每个订单详情或者商品详情:
select tid,titile from trade.fullinfo where tid in (select tid from trades.sold)
select num_iid,titile from item where num_iid in (select num_iid from items where nick = tb)
3. tql定时调用,可以指定tql在某个时刻执行,isv无须再编写大量的定时程序。如:定时设置商品的促销价格。定时tql的详细使用说明请参阅:定时服务。
4. 普通调用,简单,只要一条tql。如:获取用户信息。
select location,user_id from user where nick = tb
从效率的角度出发,原本需要对TOP发起n次请求,现在只需要1次就能搞定一切,减少了http连接,调用次数,简单快捷,提高用户体验。ISV反馈,用了TQL 速度提高40倍!!
嗯?你还在为了发起请求过多,网络不好等原因导致应用程序性能太差,赶快使用 tql,提高性能,使操作更有关联性。
1. TQL中的四类操作与开放平台服务名称之间的映射关系
Select(get),Delete(delete),Update(update,set),Insert(add,upload,publish,create)。例如,文档中taobao.user.get 就可以映射为select xxx from user,taobao.item.delete可以映射为delete from item where tt=xxx。如果发现文档中没有此类服务,则判断是否为读服务,如果是读类的服务采用select 和它原始的api名称,例如select xxx from taobao.products.search。
2. 表名规则
每个api名称是去掉前面的taobao.并且api名称结尾符合(get,delete,update,set,add,upload,publish,create),那么去除taobao.与结尾,剩下的字段作为表名,例如taobao.user.get表名就是user,taobao.trades.sold.get的表名就是trades.sold,taobao.item.delete 表名则是 item。
3. TQL可以支持嵌套和批量处理
服务计数和原来的方式一样,同时请估计一次请求会演变称为多少次请求,当前平台暂时限制一次请求可以支持嵌套或者批量发起50次真实调用,大于50部分的调用会被舍弃。例如:
select nick,email from user where nick in (tbtest1061,tbtest1063),实际上消耗流量为2。
select num_iid from item where num_iid in (select num_iid from items where nick=tb and pageSize = 100),如果用户tb有100+个商品,那么此次查询出来的商品只有49条。后面51条被舍弃。因为在查询用户tb商品的时候已经消耗了1次调用量,所以只能下49次调用量可以继续执行。
4. TQL语句中的真实业务数据可以通过占位符的方式来被参数替换
例如在TQL中select a from t where k=#value#,value的内容可以从参数中获取,QL中仅仅作为占位,具体参见第一个范例。可以支持占位的为select,delete,update中where的条件语句,insert中values中的内容,update中set 后面的value部分。
5. TQL批量结果的分隔符
因为结果是多个json连接而成,现在只要在请求TOP的时候,在参数中增加top_tql_seperator=true,那么每个返回结果都由“\r\n”分割开来。
6. 签名方式(与开放平台签名方式相同)
根据参数名称将你的所有请求参数按照字母先后顺序排序:
key + value .... key + value 对除签名和图片外的所有请求参数按key做的升序排列, value无需编码。例如:
将foo=1,bar=2,baz=3 排序为bar=2,baz=3,foo=1 参数名和参数值链接后,得到拼装字符串bar2baz3foo1 md5:将secretcode同时拼接到参数字符串头、尾部进行md5加密,再转化成大写,
格式是:byte2hex (md5(secretkey1value1key2value2...secret))。
注:hex为自定义方法,JAVA中MD5是对字节数组加密,加密结果是16字节,我们需要的是32位的大写字符串(注:图片参数不用加入签名中)。
实例
输入参数为:
ql=select num,price,type,stuff_status,title,desc,location.state,location.city,cid,props from item where num_iid=1500003171382
app_key=test
session=41115191973015bd5bdf47d66ffcYLDyLN7a520cd739159657538031
sign_method=md5
按照参数名称升序排列:
app_key=test
ql=select num,price,type,stuff_status,title,desc,location.state,location.city,cid,props from item where num_iid=1500003171382
session=41115191973015bd5bdf47d66ffcYLDyLN7a520cd739159657538031
sign_method=md5
拼装字符串:
连接参数名与参数值,并在首尾加上app_secret(这里假设appsecret=test)值:
testapp_keytestqlselect num,price,type,stuff_status,title,desc,location.state,location.city,cid,props from item where num_iid=1500003171382session41115191973015bd5bdf47d66ffcYLDyLN7a520cd739159657538031sign_methodmd5test
生成签名:
32位大写MD5值->77F9F224F75D635F1A67A77593494028
看过前面的介绍有人一定会问,对于嵌套或者批量查询,tql的一次调用为什么会使用多次流量呢?
其实可以把tql看成一条sql,嵌套查询都是先根据子查询查出结果,再根据结果去查询。
比如:select num_iid,title from item where num_iid in (select num_iid from items.onsale where page_size =40 and page_no = 1) 这样先查询用户前40条上架商品的num_iid,然后再根据num_iid,分别调taobao.item.get API 获得商品详细信息。虽然只调用了一次tql ,但是实质上已经调用接口41次。这就是TQL的实现过程,也是减少链接TOP的关键。
有话要说