赶知识网

TQL介绍

2013-08-29 / 4304次点击 开发参考

简介:

TQL(又称Taobao QL)是基于淘宝开放平台服务封装的一种查询语言调用方式,与标准REST化等模式一样,都是调用服务方式的一种变形,目的是希望能够通过使用方式的改变提高开发者开发效率,可维护性,降低性能损耗(减少http连接,调用次数等)。下面将会用具体的通过实际范例来展示使用场景。

同上所说,所有的TQL支持的服务都是开放平台已经开放的服务,因此可以参看开放平台API文档来构建TQL(http://open.taobao.com/doc/api_list.htm?id=102)。

 

TQL适用场景以及好处:

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中的四类操作与开放平台服务名称之间的映射关系

Selectget),Deletedelete),Updateupdateset),Insertadduploadpublishcreate)。例如,文档中taobao.user.get 就可以映射为select xxx from usertaobao.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表名就是usertaobao.trades.sold.get的表名就是trades.soldtaobao.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),如果用户tb100+个商品,那么此次查询出来的商品只有49条。后面51条被舍弃。因为在查询用户tb商品的时候已经消耗了1次调用量,所以只能下49次调用量可以继续执行。

4.     TQL语句中的真实业务数据可以通过占位符的方式来被参数替换

例如在TQLselect a from t where k=#value#value的内容可以从参数中获取,QL中仅仅作为占位,具体参见第一个范例。可以支持占位的为select,delete,updatewhere的条件语句,insertvalues中的内容,updateset 后面的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为自定义方法,JAVAMD5是对字节数组加密,加密结果是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的关键。

Top10

沪ICP备09053415号 © 赶知识网