Итак, JSONP или CORS? [закрытый]


мой WebAPI был развернут в интрасети окружающая среда. Это значит безопасность не моя забота.

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

любые другие проблемы, которые я мог пропустить?

5 106

5 ответов:

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

  • Если вам нужен интерфейс ajax только для чтения на ваших серверах, и вам нужно поддерживать IE
  • на с другой стороны, если ваш веб-API читается/записывается (например, full REST или просто POST/GET) вместо просто чтения (т. е. GET), JSONP отсутствует. Используйте CORS. JSONP по своей сути доступен только для чтения.

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

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

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

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

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

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

JSONP все еще a тег скрипта, поэтому независимо от того, что он вызовет некоторый уровень синхронного поведения. Корс не будет.

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

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

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

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