<?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; JSON</title>
	<atom:link href="http://www.jstoolbox.com/category/json/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.jstoolbox.com</link>
	<description>Блог о программировании вообще и о JavaScript в частности, уроки, статьи, заметки, база знаний.</description>
	<lastBuildDate>Mon, 07 Mar 2011 18:19:17 +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>
		<item>
		<title>Что такое JSONP?</title>
		<link>http://www.jstoolbox.com/2009/03/18/chto-takoe-jsonp/</link>
		<comments>http://www.jstoolbox.com/2009/03/18/chto-takoe-jsonp/#comments</comments>
		<pubDate>Wed, 18 Mar 2009 14:54:55 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[JSON]]></category>
		<category><![CDATA[MooTools]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[XMLHTTPRequest]]></category>

		<guid isPermaLink="false">http://www.jstoolbox.com/?p=422</guid>
		<description><![CDATA[<p>В последнее время довольно часто замечал в разных статьях упоминание о JSONP. Судя по названию это тот же JSON, но с каким-то наворотом. Поразобравшись немного с этим, оказалось что этот формат нужен для того, чтобы иметь возможность выполнять асинхронные запросы к серверу расположенному на другом домене. Напомню, что для объекта XMLHTTPRequest есть такое ограничение. То есть, если ваш сайт расположен по адресу <em>mysite.com</em>, то AJAX запрос на сервер <em>anothersite.com</em> выполнить не удастся.</p>]]></description>
			<content:encoded><![CDATA[<p>В последнее время довольно часто замечал в разных статьях упоминание о JSONP. Судя по названию это тот же JSON, но с каким-то наворотом. Поразобравшись немного с этим, оказалось что этот формат нужен для того, чтобы иметь возможность выполнять асинхронные запросы к серверу расположенному на другом домене. Напомню, что для объекта XMLHTTPRequest есть такое ограничение. То есть, если ваш сайт расположен по адресу <em>mysite.com</em>, то AJAX запрос на сервер <em>anothersite.com</em> выполнить не удастся.</p>
<p><span id="more-422"></span></p>
<p>Так вот, чтобы обойти это ограничение поступали следующим образом &#8211; динамически создавали и добавляли в документ новый тег <em>&lt;script&gt;</em>, который подгружал скрипт с нужными данными:</p>
<pre class="prettyprint">
&lt;script src="/some/url/here" type="text/javascript">&lt;/script>
</pre>
<p>При динамической подгрузке данных нужно выполнять callback, а для этого в конец подгружаемого скрипта добавляем вызов этой функции. В общем, получаемый от сервера скрипт может выглядеть следующим образом:</p>
<pre class="prettyprint">
var data = {
    one : "12",
    two : "34"
}

someCallback(data);
</pre>
<p>Если в указанном выше примере не объявлять переменную <em>data</em>, а сразу поместить её в вызов <em>someCallback</em>, то получим то, что сейчас стали называть <strong>JSONP</strong>:</p>
<pre class="prettyprint">
someCallback({ one : "12",  two : "34" });
</pre>
<p>В данный момент некоторые популярные сервисы поддерживают как JSON, так и JSONP. Типичным примером является API для поиска от YAHOO. Чтобы получить данные от сервера в виде JSON, мы указываем параметр <em>output=json</em>:</p>
<p><a href="http://search.yahooapis.com/WebSearchService/V1/webSearch?appid=YahooDemo&#038;query=finances&#038;format=pdf&#038;output=json">http://search.yahooapis.com/WebSearchService/V1/webSearch?appid=YahooDemo&#038;query=finances&#038;format=pdf&#038;output=json</a></p>
<p>Теперь, чтобы получить данные в виде JSONP, просто добавляем название функции-callback, в которую будут &#8220;завернуты&#8221; возвращаемые данные. Указанная выше ссылка будет выглядеть так:</p>
<p><a href="http://search.yahooapis.com/WebSearchService/V1/webSearch?appid=YahooDemo&#038;query=finances&#038;format=pdf&#038;output=json&#038;callback=loadit">http://search.yahooapis.com/WebSearchService/V1/webSearch?appid=YahooDemo&#038;query=finances&#038;format=pdf&#038;output=json&#038;callback=loadit</a></p>
<p>По этой ссылке сервер вернет следующие данные:</p>
<pre class="prettyprint">
loadit({"ResultSet":{"type":"web","totalResultsAvailable":22600000,"totalResultsReturned":10, ... } });
</pre>
<p>Теперь, короткий пример получения и обработки формата JSONP:</p>
<pre class="prettyprint">
&lt;html>
&lt;head>
&lt;script type="text/javascript">

// callback
function loadit(data) {
  // работаем с данными
  if (!data) {
    return;
  }

  var oTotal = document.getElementById("total");
  oTotal.innerHTML = data.ResultSet.totalResultsAvailable;
}

// здесь будет ссылка на новый элемент script
var oElem = null;

function sendJSONP(url, callback) {
  if (!url || !callback)
    return;

  url += '&#038;callback='+callback;

  // выполняем запрос JSONP
  if (oElem) {
    oElem.parentNode.removeChild(oElem);
  }

  oElem = document.createElement('script');
  oElem.setAttribute('type','text/javascript');
  document.getElementsByTagName('head')[0].appendChild(oElem);
  oElem.setAttribute('src', url);
}

window.onload = function(){
  document.getElementById("searchBtn").onclick = function(){
    var query = document.getElementById("query").value;
    sendJSONP('http://search.yahooapis.com/WebSearchService/V1/webSearch?appid=YahooDemo&#038;query='+encodeURIComponent(query)+'&#038;output=json', 'loadit');
  }
}
&lt;/script>
&lt;/head>
&lt;body>
&lt;input type="text" name="search" value="" id="query" />&lt;input type="button" value="Искать" name="s" id="searchBtn"/>
&lt;div id="total">&lt;/div>
&lt;/body>
&lt;/html>
</pre>
<p>Этот скрипт работает следующим образом: пользователь вводит в поле поиска искомую фразу и нажимает на кнопку <em>&#8220;Искать&#8221;</em>. Из возвращаемых результатов поиска мы выделяем значение общего количества результатов <em>totalResultsAvailable</em> и показываем это значение в элементе <em>&lt;div id=total&gt;</em>. Запрос к серверу выполняется в функции sendJSONP, которая принимает 2 параметра &#8211; url и callback.</p>
<p>В библиотеке jQuery имеется встроенная поддержка формата JSONP. При использовании этого фреймворка, нет нужды самому код, который добавляет тег SCRIPT в DOM. Всё, что нужно будет сделать, это изменить URL, чтобы указать jQuery, что выполняется JSONP запрос. Заканчивая URL вопросительным знаком, мы даем jQuery понять, что получаемые данные будут в формате JSONP. Не нужно также и указывать название функции обработчика. Пример:</p>
<pre class="prettyprint">
&lt;html>
&lt;head>
&lt;script src="/jquery/jquery.js">&lt;/script>
&lt;script>
var baseurl = 'http://search.yahooapis.com/ImageSearchService/V1/imageSearch?appid=YahooDemo&#038;output=json&#038;query='

function search() {
     var search = $("#search").val()
     console.log(search)
     var surl = baseurl + escape(search) + '&#038;callback=?'
     $.getJSON(surl, function(data) {
          var res = '&lt;h1>Search for '+search+'&lt;/h1>'
          res += '&lt;p>There were '+data.ResultSet.totalResultsAvailable+' results.&lt;/p>'
          for(var i=0; i&lt;data.ResultSet.Result.length; i++) {
               var result = data.ResultSet.Result[i]
               var resultStr = '&lt;img src="'+result['Thumbnail']['Url']+'" align="left">';
               resultStr += '&lt;a href="'+result['ClickUrl']+'">'+result['Title']+'&lt;/a>&lt;br clear="left"/>'
               res+=resultStr
           }
          $("#result").html(res)
      })
}
$(document).ready(function() {
     $("#searchBtn").click(search)
});

&lt;/script>
&lt;/head>

&lt;body>
    &lt;input type="text" name="search" id="search"> &lt;input type="button" value="Search" id="searchBtn">
    &lt;div id="result">&lt;/div>
&lt;/body>
&lt;/html>
</pre>
<p>Этот пример для работы с jQuery позаимствован на <a href="http://www.insideria.com/2009/03/what-in-the-heck-is-jsonp-and.html">InsideRIA</a>.</p>
<p>Поддержка JSONP скоро будет доступна и в <a href="http://mootools.net">Mootools</a>. В данный момент она уже есть в версии 1.3rc1. Выглядит это так:</p>
<pre class="prettyprint">
new JsonP('http://api.cnet.com/restApi/v1.0/techProductSearch', {
    data: {
        partTag: 'mtvo',
        iod: 'hlPrice',
        iewType: 'json',
        results: '100',
        query: 'ipod'
    },
    onComplete: myFunction.bind(someObject)
}).request();
</pre>
<p>На мой взгляд гораздо понятнее и проще, чем чудеса с вопросительными знаками в jQuery <img src='http://www.jstoolbox.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.jstoolbox.com/2009/03/18/chto-takoe-jsonp/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

