<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>JSToolbox - все о JavaScript &#187; YQL</title>
	<atom:link href="http://www.jstoolbox.com/category/yql/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.jstoolbox.com</link>
	<description>Блог о программировании вообще и о JavaScript в частности, уроки, статьи, заметки, база знаний.</description>
	<lastBuildDate>Wed, 28 Jul 2010 22:33:40 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>YAHOO Query Language</title>
		<link>http://www.jstoolbox.com/2009/07/23/yahoo-query-language/</link>
		<comments>http://www.jstoolbox.com/2009/07/23/yahoo-query-language/#comments</comments>
		<pubDate>Thu, 23 Jul 2009 20:14:02 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[JSON]]></category>
		<category><![CDATA[YQL]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[JSONP]]></category>
		<category><![CDATA[YAHOO]]></category>

		<guid isPermaLink="false">http://www.jstoolbox.com/?p=464</guid>
		<description><![CDATA[<p>В последнее время мне все больше нравятся различные новинки от <a href="http://yahoo.com" title="YAHOO Search Engine">YAHOO</a> и в частности то, что предназначено для разработчиков веб приложений. Одной из таких полезных новинок является <a href="http://developer.yahoo.com/yql/" title="YAHOO Query Language">YQL</a> - YAHOO Query Language, такой себе аналог языка SQL для баз данных. По сути он выполняет ту же задачу, что и SQL, однако источником данных являются не обычные базы данных, а различные ресурсы интернета. Например, можно получить последние новости из разных источников, ссылки из <a href="http://delicious.com">delicious</a>, записи из <a href="http://twitter.com">twitter-а</a>, выполнить поиск по изображениям на <a href="http://flickr.com">Flickr</a> и многое другое. Кроме того с недавнего времени YQL позволяет не только делать выборки данные, но также и выполнять вставки, удаление и обновление (CRUD).</p>]]></description>
			<content:encoded><![CDATA[<p>В последнее время мне все больше нравятся различные новинки от <a href="http://yahoo.com" title="YAHOO Search Engine">YAHOO</a> и в частности то, что предназначено для разработчиков веб приложений. Одной из таких полезных новинок является <a href="http://developer.yahoo.com/yql/" title="YAHOO Query Language">YQL</a> &#8211; YAHOO Query Language, такой себе аналог языка SQL. По сути он выполняет ту же задачу, что и SQL, однако источником данных являются не обычные базы данных, а различные ресурсы интернета. Например, можно получить последние новости из разных источников, ссылки из <a href="http://delicious.com">delicious</a>, записи из <a href="http://twitter.com">twitter-а</a>, выполнить поиск по изображениям на <a href="http://flickr.com">Flickr</a> и многое другое. Кроме того с недавнего времени YQL позволяет не только делать выборки данных, но также и выполнять добавление, удаление и обновление (CRUD).</p>
<p><span id="more-464"></span></p>
<p>Чтобы вам было более понятно, с чем мы имеем дело, покажу некоторые примеры запросов.</p>
<h4>Получение последних записей из твиттера</h4>
<p>Этот запрос просто выбирает последние записи пользователя, id которого указывается в условии <em>where</em> (в данном случае аккаунт твиттера мой &#8211; <a href="http://twitter.com/ischenko" title="Мой твиттер">http://twitter.com/ischenko</a> <img src='http://www.jstoolbox.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  ):</p>
<pre class="prettyprint">
select * from twitter.user.timeline where id='ischenko'
</pre>
<h4>Пост в твиттер</h4>
<p>В начале запроса мы подключаем таблицу twitter.status.xml, которая позволяет добавлять записи в твиттер &#8211; это так называемая <strong>Открытая таблица данных</strong> (Open Data Table). Кроме того для выполнения запросов CRUD нужно использовать защищенное соединение (https):</p>
<pre class="prettyprint">
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","****************")
</pre>
<h4>Поиск в Flickr изображений, содержащих в названии &quot;Cat&quot;</h4>
<pre class="prettyprint">
select * from flickr.photos.search where text="Cat" limit 10
</pre>
<h4>Выборка пяти последних новостей BBC</h4>
<p>Здесь нужные данные выбираются при помощи <em>xpath</em> из веб страницы с указанным <em>url</em> (в данном случае это news.bbc.co.uk). Количество возвращаемых данных ограничиваем при помощи команды LIMIT:</p>
<pre class="prettyprint">
SELECT * FROM html WHERE url='http://news.bbc.co.uk' AND xpath="//*[@id='livestats200']//ul[contains(@class,'popstoryList')]/li/a" LIMIT 5
</pre>
<p><br/></p>
<p>Теперь о том, где и как эти запросы выполнить и как получать результат. Выполнить запрос можно по следующему адресу: <em>http://query.yahooapis.com/v1/public/yql</em>. В качестве параметров нужно указать следующее: <strong>q</strong> &#8211; запрос, <strong>format</strong> &#8211; тип возвращаемых данных &#8211; XML, JSON, JSONP, <strong>callback</strong> &#8211;  функция, в которую будут &#8220;обернуты&#8221; возвращаемые данные (для работы с JavaScript), причем это касается не только JSON, но и XML. Также для некоторых таблиц необходимо указывать параметр <strong>env</strong> (в том случае, если вы явно не используете директиву USE) &#8211; в этом параметре указвыется среда выполнения, например: <em>env=http://datatables.org/alltables.env</em>.</p>
<p>Пример запроса, который выполняет выборку из <a href="http://delicious.com" rel="nofollow">Delicious</a> последних записей с тегом <em>JavaScript</em>:<br/><a href="http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20delicious.feeds.popular%20where%20tag%3D%27javascript%27&#038;format=xml&#038;env=http%3A%2F%2Fdatatables.org%2Falltables.env">http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20delicious.feeds.popular%20where%20tag%3D%27javascript%27&#038;format=xml&#038;env=http%3A%2F%2Fdatatables.org%2Falltables.env</a>.</p>
<p>Также запросы можно выполнять в <a href="http://developer.yahoo.com/yql/console/" title="YQL console">специальной консоли</a>. В ней очень удобно проверять выполнение запросов, также там содержится множество примеров и большой список доступных таблиц данных.</p>
<p>Теперь остановимся на вопросе использования YQL из JavaScript. Мне кажется, что самый простой вариант это использование <a href="http://www.jstoolbox.com/2009/03/18/chto-takoe-jsonp/" title="Что такое JSONP">JSONP</a>, ибо, как я уже писал выше, YQL запрос поддерживает параметр <strong>callback</strong>, в который вставляется результат. Реализацию такого подхода я нашел на сайте <a href="http://james.padolsey.com/javascript/using-yql-with-jsonp/" rel="nofollow">Джеймса Пэдолси</a>:</p>
<pre class="prettyprint">
// 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 + '&#038;format=json&#038;callback=YQLQuery.' + uid;
        document.body.appendChild(scriptEl);

    };
}
</pre>
<p>Используйте его так:</p>
<pre class="prettyprint">
// Составлям запрос
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();
</pre>
<p>Если вы любите работать с <a href="http://jquery.com">jQuery</a>, то можете воспользоваться следующим простым плагином:</p>
<pre class="prettyprint">
$.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 + '&#038;format=json&#038;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);
});
</pre>
<p>Ну и как обычно, напоследок <a href="http://jstoolbox.com/demo/yql.php" title="Пример работы с YQL">демо пример</a>, в котором я использую показанный выше плагин для получения и обработки RSS потока сайта <a href="href="http://ajaxian.com" rel="nofollow">Ajaxian</a>. Надеюсь вам понравится такой способ работы с данными <img src='http://www.jstoolbox.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<div class="postLinks"><strong>При поддержке:</strong><br/><a href="http://www.trucklist.ru/">http://www.trucklist.ru/</a> &#8211; продажа спецтехники<br/><a href="http://www.automania.ru/audi/">http://www.automania.ru/audi/</a><br/><a href="http://irr.ru/cars/">http://irr.ru/cars/</a>продажа подержанных автомобилей</div>
]]></content:encoded>
			<wfw:commentRss>http://www.jstoolbox.com/2009/07/23/yahoo-query-language/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
