Ответы:
Это довольно широкий вопрос, и он может потребовать отдельной вики. В Google также довольно много информации об этих двух вещах, но я думаю, что смогу затронуть несколько ключевых моментов.
Если ни то, ни другое не вызывает беспокойства, я бы просто выбрал то, что вам проще или знакомее. Если это не так, попробуйте CORS, так как это более «современное» решение, а JSONP - это скорее взлом, превращающий данные в скрипты для обхода междоменных ограничений. Однако CORS обычно требует дополнительной конфигурации на стороне сервера.
Если вы используете jQuery, я не уверен, откуда у вас возникла идея, что CORS « намного удобнее для клиента и проще в реализации ». Видеть Https://gist.github.com/3131951 . jQuery абстрагирует детали JsonP, и CORS может быть довольно сложно реализовать на стороне сервера в зависимости от того, какую технологию вы используете.
Недавно я разработал веб-приложение, использующее jquery и backbone.js, которое читает из различных междоменных веб-сервисов, которые мы контролируем, и в итоге использовал Json-P вместо CORS, потому что нам нужно поддерживать IE7, и это было немного проще на на стороне сервера (мы запускаем Django с DjangoRestFramework) и практически то же самое с jquery на стороне клиента.
Вы очень на месте. Если вам не нужно поддерживать устаревшие браузеры (выпущенные более 6 лет назад), я определенно выбрал бы CORS.
CORS проще реализовать, поскольку, если ваш API еще не поддерживает JSONP или CORS, проще просто добавить несколько статических заголовков, чем изменять тело ответов.
Также проще кэшировать запросы с помощью CORS. Каждый запрос JSONP должен быть динамическим даже с содержимым memcached.
JSONP по-прежнему является тегом скрипта, поэтому независимо от того, что он вызовет некоторый уровень синхронного поведения. CORS не будет.
JSONP может быть только GET. Как и в случае с CORS, вы можете использовать любой метод.
И последнее, но не менее важное: если вы используете jQuery v1.x , учтите , что обработчики error
и complete
(или, лучше, fail
и always
) по-прежнему не вызываются для запросов JSONP в некоторых распространенных ситуациях (например, при сетевых ошибках). Конечно, есть обходные пути (настройка тайм-аута, плагин jQuery-JSONP), но я считаю CORS менее раздражающим, особенно когда междоменные запросы поступают только с мобильных устройств (например, гибридные приложения), поэтому вам не нужна поддержка неудачных браузеров.
Наш веб-API не работал в Safari (iOS 9.1) с проверкой подлинности Windows. Он работал с Safari + iOS 8.4. Когда мы перешли на JSONP, Safari снова заработал. Проверьте эту ссылку для получения дополнительной информации.