JSONP, статика и CDN

поскольку CORS ещё отсутствует в большинстве пользовательских браузеров, для загрузки информации с посторонних доменов нам всё ещё приходится использовать JSONP. Думаю, абсолютное большинство JSONP-сервисов, которые вы видели или проектировали, ожидают от клиента, что тот укажет имя функции-обработчика в параметрах запроса. Запрос придёт в скрипт, который обернёт данные в вызов этой функции и отдаст результат клиенту.

но что, если у вас на сервере нету скриптов? Что, если вы отдаёте статические файлы через CDN и не собираетесь отказываться от быстрой доставки данных в браузер пользователя и сниженной нагрузки на свои сервера? С некоторыми предпосылками решение такой проблемы довольно очевидно, хотя и вступает в противоречие с привычным шаблоном использованием JSONP.

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

используя этот подход в картах нокии, мы решили, что имя обработчика должно быть универсальным, чтобы этот же код можно было повторно использовать и в других местах. Поскольку исходная задача — всё-таки загрузка JSON в браузер, логично разместить функции в глобальном объекте JSON, прицеливаясь на стандартизацию. В итоге запрос данных и файл ответа выглядят примерно вот так:

JSON.request({
    uri: 'http://example.com/static.jsonp',
    notify: true
});

JSON.notify(
    'http://example.com/static.jsonp',
    {crossDomain: true}
);

Артемий Трегубенко,

comments powered by Disqus