2. easyAPI. Удаленная загрузка XML.

Автор: Вячеслав Гринин | веб-мастеру, веб-программирование | 30 Янв 2010 1:00 пп

И вот, наконец, долгожданная, вторая статья из раздела easyAPI.

Сегодня мы узнаем, как загрузить XML-данные с удаленного домена. Подобная задача возникает, например, когда владелец сайта на бесплатном (а значит – без серверного кода) хостинге хочет вставить в страницу погодный XML-информер. Именно на этом примере мы и рассмотрим сегодня удаленную загрузку XML-файлов.

Итак, для фоновой загрузки данных мы привыкли использовать так называемый AJAX, то есть объект XMLHttpRequest, про эту технологию я уже не раз писал в статьях блога. Однако, эта технология в данном случае никуда не годится. Почему? А потому что объект XMLHttpRequest не позволяет делать запросы к доменам, иным, чем тот, в котором работает скрипт, создающий этот объект.

И здесь к нам на помощь приходит технология, получившая название JSONP, что значит JavaScript Object Notation with Padding. Про сам JSON можео почитать вот здесь JSON, а JSONP представляет собой объект в нотации JSON обернутый в вызов функции, что-то вроде этого:

onSuccess('JSON-object')

А теперь объясню, зачем это нужно. Хоть XMLHttpRequest и не позволяет делать запросы к удаленным доменам, однако все браузеры позволяют нам загружать JavaScript’ы с любых доменов, то есть страница, загруженная с домена localdomain.ru, позволяет выполнить в ее рамках следующую инструкцию:

<script type='text/javascript' src='http://remotedomain.ru'>
</script>

А теперь смотрите, что происходит. Наша страница загружает скрипт с удаленного домена, а скрипт этот возвращает нам JSONP-конструкцию, которая после загрузки скрипта тут же и выполнится, а значит, вызовет некую предопределенную заранее функцию onSuccess, которая получит в качестве аргумента тот самый XML-файл. И теперь мы можем делать с ним все, что захотим!

Осталось только одно – завладеть таким remotedomain.ru, который вернет нам то, что нам нужно. Скажу, что домен этот – http://easyapi.ru. Да-да, именно на этом, предусмотрительно приобретенном не так давно домене, и будут жить все наши полезные, жизненно необходимые почти каждому веб-разработчику, функции. :) Скромненько и со вкусом…

Итак, в рамках домена easyapi.ru я уже создал ответную часть для удаленной загрузки XML-документов. Живет она вот здесь: http://easyapi.ru/xml/get.php и принимает на входе два GET-параметра: url и callback. Первый из них – адрес, с которого будет загружаться XML-файл, а второй – имя JavaScript-функции, которая будет вызвана после загрузки, и которая должна будет обработать полученный XML-документ.

Не откладывая дело в долгий ящик, приведу ниже содержимое страницы, которая, используя наш сервис easyAPI, загружает данные об XML-погоде в городе Москва и при помощи XSLT-шаблона преобразует эти данные в красивый информер, который вы, кстати, изучив основы XSLT-преобразований, сможете оформить по своему усмотрению.

Вот исходный код страницы:

<html>
<head>
<script type="text/javascript">
function getXMLFromString(s) {
    if(window.ActiveXObject)
    {
        var xml;
        xml=new ActiveXObject("Microsoft.XMLDOM");
        xml.async=false;
        xml.loadXML(s);
        return xml;
    }
    else if(window.DOMParser)
    {
      var parser = new DOMParser();
      return parser.parseFromString(s,'text/xml');
    }
    else
    {
        alert("Загрузка XML не поддерживается браузером");
        return null;
    }
}

function getXMLDocument(url)
{
    var xml;
    if(window.XMLHttpRequest)
    {
        xml=new window.XMLHttpRequest();
        xml.open("GET", url, false);
        xml.send("");
        return xml.responseXML;
    }
    else
        if(window.ActiveXObject)
        {
            xml=new ActiveXObject("Microsoft.XMLDOM");
            xml.async=false;
            xml.load(url);
            return xml;
        }
        else
        {
            alert("XML loading not supported");
            return null;
        }
}

function transformXslt(source,style) {
    if(window.ActiveXObject)
    {
        return source.transformNode(style);
    }
    else if(window.XSLTProcessor)
    {
        var xsltProcessor=new XSLTProcessor();
        xsltProcessor.importStylesheet(style);
        var resultDocument = xsltProcessor.transformToDocument(source);
        var xmls = new XMLSerializer();
        return xmls.serializeToString(resultDocument);
    }
    else
    {
        alert("Преобразование XML не поддерживается браузером");
        return null;
    }
}

</script>

</head>
<body>
<div id="res"></div>
<script type="text/javascript">
function onSuccess(res)
{
    var xslt = getXMLDocument("http://easy4web.ru/samples/easyxml/gis.xsl");
    var xml = getXMLFromString(res.result);
    var res = transformXslt(xml, xslt);
    document.getElementById("res").innerHTML=res;
}
</script>
<script src="http://easyapi.ru/xml/get.php?url=http://informer.gismeteo.ru/xml/27612_1.xml&callback=onSuccess" type="text/javascript"></script>
</body>
</html>

В первой части страницы мы видим три функции, все они – кроссбарузерные:

  • getXMLFromString(s) – преобразует валидную строку s в XML-документ
  • getXMLDocument(url) – загружает XML-документ с адреса url
  • transformXslt(source,style) – преобразует XML-документ source при помощи XSLT-шаблона style

В нижней части исходного кода мы видим функцию onSuccess – ока как раз и выполнится после загрузки xml-документа с удаленного домена. Она отрисует загруженный и полученный в переменной res.result XML-Документ при помощи XSLT-файла, хранящегося по адресу http://easy4web.ru/samples/easyxml/gis.xsl
И в самой-самой нижней части исходного кода мы видим вот такую конструкцию:

<script src="http://easyapi.ru/xml/get.php?url=http://informer.gismeteo.ru/xml/27612_1.xml&callback=onSuccess" type="text/javascript"></script>

Вот эта часть и представляет собой загружалку XML-документов с удаленных доменов. Как видим в атрибуте src тега SCRIPT мы указали, кто будет заниматься загрузкой (http://easyapi.ru/xml/get.php), что он будет загружать (url=http://informer.gismeteo.ru/xml/27612_1.xml) и какая функция займется обработкой документа (callback=onSuccess)

Здесь вы можете скачать исходные коды приведенного примера. А вот здесь – посмотреть, как это работает.

Прочтите еще:

Начинаем создавать набор сервисов easyAPI

Автор: Вячеслав Гринин | веб-мастеру | 09 Окт 2009 9:00 пп

Создавая статьи на темы, интересующие посетителей, отвечая на их комментарии, и даже выполняя платные заказы на эти темы я все больше понимал, что пора создавать некий набор сервисов и библиотек, реализующих насущные потребности пользователей веб-сайтов.

Собственно, этой статьей я начинаю публикацию на нашем ресурсе сервисов под общим названием easyAPI.

Что это будет?

EasyAPI это по большей части JavaScript-библиотеки, реализующие ту или иную функциональность, я пока до конца не знаю, какие именно сервисы я буду предоставлять и в каком виде. Но точно знаю, что эти сервисы помогут, например, владельцу сайта, поднятого на бесплатном хостинге, отобразить погодный информер, настроенный полностью под требования веб-мастера. Или, например, позволят определить географию посетителей определенного сайта и отобразить ее на карте страны. Или, например, отобразить посетителю сайта погодный информер именно его города. И все это, повторюсь, чаще всего будет возможно даже на хостинге без поддержки PHP.

Короче говоря, от слов к делу!

И сегодня на сайте easy4web.ru появляется первый такой сервис – GeoIP, позволяющий по адресу посетителя определить его приблизительное местоположение.

Он живет здесь http://easy4web.ru/api/geoip/get.php

Поддерживаемые параметры:
p – формат отдаваемых данных:

  • p=j – результат – JSON
  • p=a – результат – массив вида cc2=RU;cc3=RUS;cty=Moskow
  • p=x – результат – XML
  • p=ax – результат – массив обернутый в XML, вида <easy>cc2=RU;cc3=RUS;cty=Moskow</easy>
  • p=jx – результат – JSON обернутый в XML, вида <easy>cc2=RU;cc3=RUS;cty=Moskow</easy>

f – длина имен полей:

  • f=f – длинные имена, вида country_code
  • f=s – короткие имена, вида cc2

ip – IP-адрес, если он не задан, то в качестве адреса берутся координаты сервера, с которого пришел запрос REMOTE_ADDR.

s – кодировка(charset) отдаваемых данных.
Например s=koi8-r или s=utf-8, по умолчанию считается s=windows-1251.

Если я желаю получить информацию по собственному местоположению в формате JSON с длинными именами полей, я вызову URL http://easy4web.ru/api/geoip/get.php?p=j&f=f

В следующей статье на эту тему я расскажу о том, как можно применить данный сервис при вызове его из PHP-программы, и из JavaScript на удаленном сервере. Пока сервис easy.GeoIP находится в стадии тестирования, возможны некоторые изменения в его работе, о которых я буду предупреждать на сайте.

Сервис переехал на другой адрес. Теперь он живет здесь http://easyapi.ru/geoip/get.php

Добавился новый параметр c-коллбэк. Применяется только в режиме p=j/. Таким образом, вызвав http://easyapi.ru/geoip/get.php?p=j&c=onGet, мы получим пакет вида:

onGet('{"country_code":"RU","country_code3":"RUS","country_name":
"Russian Federation","region":48,"city":"Moscow",
"latitude":55.7522,"longitude":37.6156}');

Добавил поля error, country_name_ru, city_ru (их краткие эквиваленты: err, cnr, ctr). Возвращают описание ошибки, название страны на русском языке, название города на русском языке. также добавил возврат заголовка charset=utf-8, и указал заголовок кодировки и версии xml. Результат выложен по адресу: http://easyapi.ru/geoip/get1.php, после тестирования он перейдет в официальную версию. Особенно интересно, чтобы его протестировали те, кто уже пользуется этим сервисом без улучшений.

Исправил проблему с кодировками. Добавил во входные параметры требуемую кодировку, она теперь задается параметром s, например s=utf-8. По умолчанию считается charset=windows-1251. Ликвидировал тестовый хэндлер get1.php, все изменения внес в get.php после собственного тестирования. Скоро будет статья на тему того, как все это использовать в PHP и JavaScript.

Прочтите еще:

Начинаем первые скромные попытки по монетизации блога

Автор: Вячеслав Гринин | веб-мастеру | 15 Мар 2009 8:27 пп

Итак, обладая некой скромной посещаемостью от 20 до 65 уников в сутки, а также имея приблизительно 650 подписчиков на трех серверах рассылок, начинаем пытаться выжать первые доллары с нашего блога. Если честно, не имею ни малейшего представления, что из этого выйдет, но кто ничего не делает, тот не имеет никаких результатов.
А поэтому зарегистрируемся для начала в сервисе Blogun.ru. Посмотрим, что из этого выйдет.
Блогун - монетизируем блоги

Прочтите еще:

    None Found

Влияние социальных закладок на пузомерки и посещаемость.

Автор: Вячеслав Гринин | веб-мастеру | 08 Фев 2009 1:07 дп

Итак, ваш свеженький сайт уже опубликован в сети, а посетителей – кот наплакал. И в душе поднимается обида на все человечество: “Как же так! На мой отличный сайт никто не ходит?”. А как иначе, ведь о нем еще пока мало кто знает. И теперь нам нужно добиться, чтобы люди узнали о нем. Понятное дело, на рекламу у нас денег нет.

Чтобы люди имели возможность узнать о нас, есть несколько замечательных возможностей, одна из них – сервисы социальных закладок.

Закладка – ссылка на интересный, значимый по Вашему мнению сайт.
Сервис социальных закладок – это интернет-сервис, где можно хранить такие ссылки. То есть теперь значимые для Вас ссылки хранятся не в библиотеке закладок браузера, и не в текстовом файле, а в интернете. И поэтому, с любого компьютера Вы имеете легкий доступ ко всем Вашим закладкам. Вы можете также обмениваться ссылками с Вашими знакомыми. Сохраняя закладку, Вы можете указать, чтобы она была публичной, то есть доступной всем пользователям данного закладочного сервиса, а значит – и поисковым роботам.

Итак, многочисленные эксперименты веб-мастеров с социальными закладками выявили несколько основных фактов:
1)    Влияние прогона по социальным закладкам никак или почти никак не влияет на тИЦ. Мнения разных веб-мастеров относительно этого разнятся, кто-то утверждает, что достиг незначительного роста тИЦ, кто-то разочарованно сообщил, что после очередного апа яндекса тИЦ остался на прежнем нулевом уровне.
2)    Прогон по социальным закладкам дает кратковременный рост посещаемости вашего сайта (3-5 дней), после чего посещаемость снова падает. Хотя здесь нужно учитывать то, насколько вообще интересен Ваш сайт. Ведь если пользователь, пришедший к Вам с закладок, обнаружит для себя что-то интересное, то он и впредь будет заходить к Вам. Если же ничего интересного для себя он там не обнаружил, попрощайтесь с ним навсегда.
3)    Также не обнаружено существенное влияние прогона по закладкам на PR ресурса.
4)    Прогон по закладочным сервисам помогает поднять позицию сайта в поисковиках. Причем, лучше всего показатели по Google, далее идет Yandex, затем Rambler.

Таким образом есть реальные шансы лишь увеличить посещаемость сайта. Чтобы всплеск посещаемости не носил кратковременного характера, необходимо периодически добавлять на сервисах новые закладки, причем не постить туда одну и ту же ссылку с одним и тем же описанием, а поступать творчески. То есть 2-3 раза в неделю публиковать новые закладки на разные страницы Вашего сайта. Если у Вас, например, блог, и Вы хотя бы два-три раза в неделю публикуете на блоге новый пост, то можете сразу же дублировать его ссылкой на пост в социальных закладках. Обычно новые закладки публикуются наверху в списке закладок, пока их не вытеснят вниз более свежие, а значит, есть шанс, что Вас кто-нибудь успеет заметить и, заинтересовавшись предложенной темой, перейдет на Ваш сайт.

С точки зрения тИЦ, постоянная публикация новых закладок – бессмысленна, ведь при его подсчете учитывается лишь факт наличия цитирования с домена, то есть всы ссылки с домена «клеятся», на PR возможно слабое влияние, но больше +1 ждать не приходится.

Кстати, если Ваш сайт не обновляется настолько часто, чтобы Вы смогли 2-3 раза в неделю публиковать новые закладки с новыми ссылками, то есть смысл на каждом прогоне по закладкам создавать новый аккаунт, так как за ссылочный спам Ваш аккаунт очень быстро будет забанен вместе с Вашими закладками. Каждый раз необходимо менять описание и название закладки.

А вот Вам список наиболее популярных в рунете закладочных сервисов:

http://memori.ru/
http://moemesto.ru/
http://toodoo.ru/
http://myscoop.ru/
http://www.ruspace.ru/
http://text20.ru/
http://newblogs.ru/
http://news2.ru/
http://zakladki.yandex.ru/
http://smi2.ru/
http://www.gazeta.lv/published
http://www.mister-wong.ru/
http://webmarks.ru/
http://www.ru-marks.net/
http://bobrdobr.ru/main.html
http://google.ru/Bookmarks
http://www.100zakladok.ru/
http://vaau.ru/
http://newsland.ru/
http://www.lopas.ru/
http://myelect.ru/

А Вот здесь http://www.postquickly.com/ можно прочитать, как сделать добавление закладок во все эти сервисы быстрым и безболезненным.

Прочтите еще:

    None Found