09月20, 2010

YQL & BQL?

YQL介绍

YQL(Yahoo! Query Language)是一种支持对互联网上的数据进行查询、过滤、连接、类似SQL语法的简单语言,主要是方便前端对一些数据接口的快速调用,不用记住非常繁杂的URL。

YQL类似于包括XPath/XQuery, 微软的LINQ, google的GQL, Facebook的FQL, 以及Amazon SimpleDB的查询接口和CouchDB等大多数的现代查询语言。

YQL就像一个超大的数据库,从理论上,这个数据库可以包含整个互联网上的信息。无论您是要基于各种API操作数据,还是从feed源(如RSS, XML,ATOM)获取数据,甚至是从指定的HTML页面上抓取结果,您所需要的就是使用YQL这种类似SQL的简单查询语言:

SELECT something FROM table_name WHERE some_field=some_value

使用YUI里的YQL

Yui 3.2.0版本里已经内置了YQL组件,使用方式很简单,加载seed文件,然后调用yql就可以了。

<script src="http://yui.yahooapis.com/3.2.0/build/yui/yui-min.js" type="text/javascript">

YUI().use('yql', function(Y) { Y.YQL('select * from weather.forecast where location=90210', function(r) { var results = r.query.results //use result do something }); });

YQL前端实现方式

yql的前端实现方式非常简单,主要就是将sql发送到一个特定的代理页面,可以手动指定,如果没有指定的话则使用默认的。

YUI.add('yql', function(Y) { var YQLRequest = function (sql, callback, params, opts) { if (!params) { params = {}; } params.q = sql; //Allow format override.. JSON-P-X if (!params.format) { params.format = Y.YQLRequest.FORMAT; } if (!params.env) { params.env = Y.YQLRequest.ENV; } this._params = params; this._opts = opts; this._callback = callback; }; YQLRequest.prototype = { _opts: null, _callback: null, _params: null, send: function() { var qs = '', url = ((this._opts && this._opts.proto) ? this._opts.proto : Y.YQLRequest.PROTO); Y.each(this._params, function(v, k) { qs += k + '=' + encodeURIComponent(v) + '&'; }); url += ((this._opts && this._opts.base) ? this._opts.base : Y.YQLRequest.BASE_URL) + qs; Y.jsonp(url, this._callback); return this; } }; YQLRequest.FORMAT = 'json'; YQLRequest.PROTO = 'http'; YQLRequest.BASE_URL = ':/'+'/query.yahooapis.com/v1/public/yql?'; //通用代理页面 YQLRequest.ENV = 'http:/'+'/datatables.org/alltables.env'; //所以异步接口存放地址 Y.YQLRequest = YQLRequest; Y.YQL = function(sql, callback, params) { return new Y.YQLRequest(sql, callback, params).send(); }; }, '3.2.0' ,{requires:['jsonp']});

在实际中,例如:yql的demo页面: 代理页面的地址为:http://developer.yahoo.com/yql/console/proxy.php

YQL服务端实现

YQL在服务端实际上是建立了一个强大的数据库,这个数据库维护着每个异步接口到具体URL的映射,并且将这些异步接口进行分类,从而形成了weather.forecast这样的二维对象,这些数据可以直接放在内存里,从而加快访问速度。

前端传送q参数的值到后端后,后端分析q参数的值,获取到分类和where条件。然后再隐射表里找到对应的异步请求原地址,并且将where条件赋值在其后。然后后端发送一个HTTP请求,最终将数据返回到前端。

百度的BQL?

在百度这边,每个产品线都有很多的异步请求。目前这些接口主要跟随项目文档而存在,有些紧急的项目可能连项目接口文档都没有。这样在后期维护以及其他人使用这些异步接口时就非常的困难。跨产品线的异步接口调用就更麻烦了。如果建立一个类似于YQL的BQL对这些异步请求进行管理,然后有个总体的文档所在,这样就方便很多了。

可以根据产品线对繁多的异步接口进行分类,如:

baidu.space.getFriendList

baidu.tieba.getVisitorList

这样就要方便快捷很多了。

参考文档:

1、Yahoo! Query Language

2、Ask Satyam: Using YQL and YUI with YQLDataSource

3、YQL介绍

本文链接:http://welefen.com/post/yql-bql.html

-- EOF --

Comments

评论加载中...

注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。