Итак, JSONP или CORS?

Мой WebAPI был развернут в среде Intranet. Это означает, что безопасность не была моей проблемой.

Кажется, что CORS гораздо более дружелюбен к клиенту и проще реализовать.

Любые другие проблемы, которые я, возможно, пропустил?

Ответ 1

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

  • Если вам нужен интерфейс ajax для чтения только для чтения, и вам необходимо поддерживать IE <= 9, Opera < 12 или Firefox 3.5 или другие другие старые или неясные браузеры, CORS не используется, используйте JSONP. IE8 и IE9 поддерживают поддержку CORS, но имеют проблемы, см. Ссылку в первом комментарии ниже.
  • С другой стороны, если ваш веб-API читается/записывается (например, полный REST или просто POST/GET) вместо простого чтения (т.е. GET), JSONP отсутствует. Используйте CORS. JSONP по своей сути доступен только для чтения.

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

Если вы используете jQuery, я не уверен, где вы придумали идею о том, что CORS " гораздо более дружелюбный для клиента и проще реализовать". См. https://gist.github.com/3131951. jQuery абстрагирует детали JsonP, и CORS действительно может быть несколько сложным для внедрения на вашей серверной стороне в зависимости от используемой вами технологии.

Недавно я разработал веб-приложение, используя jquery и backbone.js, который читает из разных междоменных веб-сервисов, которыми мы управляем, и закончил использование Json-P вместо CORS, потому что нам нужно поддерживать IE7, и это было бит на стороне сервера (мы запускаем Django w/DjangoRestFramework) и практически то же самое с jquery на стороне клиента.

Ответ 2

Ты довольно спокоен. Если вам не нужно поддерживать устаревшие браузеры (выпущенные 6 лет назад), я бы обязательно пошел с CORS.

CORS проще реализовать, поскольку если ваш API еще не поддерживает JSONP или CORS, проще просто добавить несколько статических заголовков, чем модифицировать тело ответов.

Также проще кэшировать запросы с помощью CORS. Каждый запрос JSONP должен быть динамическим даже с содержимым memcached.

JSONP по-прежнему является тегом script, поэтому независимо от того, что это вызовет некоторый уровень синхронного поведения. CORS не будет.

JSONP может быть только GET. И как с CORS вы можете использовать любой метод.

Ответ 3

И последнее, но не менее важное: если вы используете jQuery v1.x, считайте, что обработчики error и complete (или лучше fail и always) все еще не вызываются для запросов JSONP в некоторых распространенных ситуациях (например, сетевых ошибок). Конечно, есть обходные пути (настройка тайм-аута, плагин jQuery-JSONP), но я считаю, что CORS менее раздражает, особенно когда кросс-доменные запросы поступают только с мобильных устройств (т.е. гибридных приложений), поэтому вам не нужна поддержка для неудачных браузеров.

Ответ 4

Согласно документации Spring, JSONP - это взлом, а не правильное решение для совместного использования ресурсов Cross Origin. Поэтому, если безопасность не является для вас проблемой, просто проверьте источник своего домена на своем сервере и добавьте заголовок Access-Control-Allow-Origin Response.

Ответ 5

Наш веб-API не работал с Safari (iOS 9.1) с проверкой подлинности Windows. Он работал с Safari + iOS 8.4. Когда мы перешли на JSONP Safari, он снова начал работать. Для получения дополнительной информации просмотрите эту ссылку.