
В последнее время мне все больше нравятся различные новинки от YAHOO и в частности то, что предназначено для разработчиков веб приложений. Одной из таких полезных новинок является YQL – YAHOO Query Language, такой себе аналог языка SQL. По сути он выполняет ту же задачу, что и SQL, однако источником данных являются не обычные базы данных, а различные ресурсы интернета. Например, можно получить последние новости из разных источников, ссылки из delicious, записи из twitter-а, выполнить поиск по изображениям на Flickr и многое другое. Кроме того с недавнего времени YQL позволяет не только делать выборки данных, но также и выполнять добавление, удаление и обновление (CRUD).
Чтобы вам было более понятно, с чем мы имеем дело, покажу некоторые примеры запросов.
Получение последних записей из твиттера
Этот запрос просто выбирает последние записи пользователя, id которого указывается в условии where (в данном случае аккаунт твиттера мой – http://twitter.com/ischenko
):
select * from twitter.user.timeline where id='ischenko'
Пост в твиттер
В начале запроса мы подключаем таблицу twitter.status.xml, которая позволяет добавлять записи в твиттер – это так называемая Открытая таблица данных (Open Data Table). Кроме того для выполнения запросов CRUD нужно использовать защищенное соединение (https):
use 'http://www.yqlblog.net/samples/twitter.status.xml';
insert into twitter.status (status,username,password) values ("Playing with INSERT UPDATE and DELETE in YQL", "ischenko","****************")
Поиск в Flickr изображений, содержащих в названии "Cat"
select * from flickr.photos.search where text="Cat" limit 10
Выборка пяти последних новостей BBC
Здесь нужные данные выбираются при помощи xpath из веб страницы с указанным url (в данном случае это news.bbc.co.uk). Количество возвращаемых данных ограничиваем при помощи команды LIMIT:
SELECT * FROM html WHERE url='http://news.bbc.co.uk' AND xpath="//*[@id='livestats200']//ul[contains(@class,'popstoryList')]/li/a" LIMIT 5
Теперь о том, где и как эти запросы выполнить и как получать результат. Выполнить запрос можно по следующему адресу: http://query.yahooapis.com/v1/public/yql. В качестве параметров нужно указать следующее: q – запрос, format – тип возвращаемых данных – XML, JSON, JSONP, callback – функция, в которую будут “обернуты” возвращаемые данные (для работы с JavaScript), причем это касается не только JSON, но и XML. Также для некоторых таблиц необходимо указывать параметр env (в том случае, если вы явно не используете директиву USE) – в этом параметре указвыется среда выполнения, например: env=http://datatables.org/alltables.env.
Пример запроса, который выполняет выборку из Delicious последних записей с тегом JavaScript:
http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20delicious.feeds.popular%20where%20tag%3D%27javascript%27&format=xml&env=http%3A%2F%2Fdatatables.org%2Falltables.env.
Также запросы можно выполнять в специальной консоли. В ней очень удобно проверять выполнение запросов, также там содержится множество примеров и большой список доступных таблиц данных.
Теперь остановимся на вопросе использования YQL из JavaScript. Мне кажется, что самый простой вариант это использование JSONP, ибо, как я уже писал выше, YQL запрос поддерживает параметр callback, в который вставляется результат. Реализацию такого подхода я нашел на сайте Джеймса Пэдолси:
// YQL serves JSONP (with a callback) so all we have to do
// is create a script element with the right 'src':
function YQLQuery(query, callback) {
this.query = query;
this.callback = callback || function(){};
this.fetch = function() {
if (!this.query || !this.callback) {
throw new Error('YQLQuery.fetch(): Parameters may be undefined');
}
var scriptEl = document.createElement('script'),
uid = 'yql' + +new Date(),
encodedQuery = encodeURIComponent(this.query.toLowerCase()),
instance = this;
YQLQuery[uid] = function(json) {
instance.callback(json);
delete YQLQuery[uid];
document.body.removeChild(scriptEl);
};
scriptEl.src = 'http://query.yahooapis.com/v1/public/yql?q='
+ encodedQuery + '&format=json&callback=YQLQuery.' + uid;
document.body.appendChild(scriptEl);
};
}
Используйте его так:
// Составлям запрос
var query = "select * from rss where url='feeds2.feedburner.com/ajaxian' limit 1";
// Создаем обработчик
var callback = function(data) {
var post = data.query.results.item;
alert(post.title);
};
// Создаем экземпляр класса
var ajaxianPosts = new YQLQuery(query, callback);
// Выполняем запрос
ajaxianPosts.fetch();
Если вы любите работать с jQuery, то можете воспользоваться следующим простым плагином:
$.YQL = function(query, callback) {
if (!query || !callback) {
throw new Error('$.YQL(): Parameters may be undefined');
}
var encodedQuery = encodeURIComponent(query.toLowerCase()),
url = 'http://query.yahooapis.com/v1/public/yql?q='
+ encodedQuery + '&format=json&callback=?';
$.getJSON(url, callback);
};
// Использование
$.YQL("select * from rss where url='feeds2.feedburner.com/ajaxian' limit 1", function(data) {
var post = data.query.results.item;
alert(post.title);
});
Ну и как обычно, напоследок демо пример, в котором я использую показанный выше плагин для получения и обработки RSS потока сайта Ajaxian. Надеюсь вам понравится такой способ работы с данными
http://www.trucklist.ru/ – продажа спецтехники
http://www.automania.ru/audi/
http://irr.ru/cars/продажа подержанных автомобилей
