JSONP - Объясните подводные камни jQuery.ajax () static jsonpCallback (по сравнению со случайными именами обратного вызова jQuery)

Я обслуживаю свой файл JSONP JavaScript на статическом файловом сервере - GitHub Pages.

Это означает, что я не могу динамически установить имя функции обратного вызова JSONP на сервере ...

Динамический пример - PHP

header('Content-Type: text/javascript; charset=utf8');
$data = '{ "foo":"bar" }'; // json string
echo $_GET['callback'] .'('.$data.');'; // function name set via ?callback=xyz

jQuery.ajax () имеет параметр jsonpCallback для определения имени статической функции обратного вызова. Итак, я могу серверить файл javascript, например. test-jsonp.js со следующим содержанием:

Статический пример - файл JavaScript

jsonpCallbackABC({ "foo":"bar" });

Однако документация jQuery предполагает, что статический менее желателен.

http://api.jquery.com/jQuery.ajax/

jsonpCallback
Укажите имя функции обратного вызова для запроса JSONP. Это значение будет использоваться вместо случайного имени, автоматически сгенерированного jQuery. Желательно, чтобы jQuery генерировал уникальное имя, так как это упростит управление запросами и обеспечит обратные вызовы и обработку ошибок. Вы можете указать обратный вызов, если хотите улучшить кеширование браузером запросов GET.

Может ли кто-нибудь более подробно рассказать о подводных камнях статических имен функций JSONP?


person Chris Jacob    schedule 17.05.2011    source источник
comment
В частности, я хотел бы, чтобы кто-нибудь прокомментировал любые проблемы с безопасностью.   -  person Matthew Simoneau    schedule 16.10.2012


Ответы (2)


Если в вашем коде есть другое место, где определена функция с таким же именем, она столкнется с функцией в файле jsonp.

У вас также могут возникнуть проблемы, если вы попытаетесь вызвать одну и ту же службу в разных частях страницы, все вызовы ajax будут получать один и тот же ответ, это может затруднить отладку поведения.

person Guillaume Davion    schedule 17.05.2011

Это просто: выполняет ли ваша страница одновременные запросы с использованием jsonp (в основном это делают страницы, поскольку запросы запускаются асинхронно из событий страницы)?

Если это так, ответы будет сложнее разделить и обработать, если у вас есть одна точка входа (один обратный вызов jsonp).

Я использовал статическое имя функции обратного вызова в недавнем проекте, но оно использовалось в синхронном режиме и только один раз за время существования страницы, поэтому сделать имя обратного вызова статическим не было проблемой.

person Monoman    schedule 17.05.2011
comment
Интересно, может ли $ .getScript () быть лучшим вариантом при работе со статическим именем функции ... Думаю о возврате переменной с пространством имен, а не о попытке вызвать функцию api.jquery.com/jQuery.getScript Что вы думаете? - person Chris Jacob; 17.05.2011
comment
+1 Боже мой, какое-то время отлаживал, пока не наткнулся на это. Теперь это кажется таким очевидным! Если у вас есть несколько запросов jsonp ajax на одной странице, вам нужно несколько функций обратного вызова, а не одна функция обратного вызова, используемая для всех ваших запросов ajax. Это было особенно проблематично, потому что один из моих запросов был кэширован, а другой - нет. @Monoman, Спасибо за полезный ответ! - person Landon Poch; 12.02.2014