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

111

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

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

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

rhapsodyn
источник

Ответы:

144

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

  • Если вам нужен интерфейс ajax только для чтения для ваших серверов, и вам нужно поддерживать IE <= 9, Opera <12 или Firefox <3.5 или другие старые или малоизвестные браузеры, CORS отсутствует, используйте JSONP. IE8 и IE9 sorta поддерживают 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 с DjangoRestFramework) и практически то же самое с jquery на стороне клиента.

Бен Робертс
источник
3
Если вы поддерживаете IE8 и IE9, это также может исключить CORS из-за того, что Content-Type вынужден использовать значение «text / plain», см. Пункт (4) на blogs.msdn.com/b/ieinternals/archive/2010/05 / 13 /…
jamiebarrow
Суть вашего ответа очень полезна, спасибо!
MVCDS
Я понял, что JSONP нужно обрабатывать на стороне клиента, а CORS - на стороне сервера. верный?
Падения
Я просто хочу добавить, что даже jsonp можно вызывать через GET, вы можете закодировать свой бэкэнд для выполнения записи. Вы можете передать параметр в строке запроса, чтобы вы могли имитировать публикацию, размещение, исправление с параметрами GET и quesystring. (не идеал конечно)
Габриэль Кариньяно
45

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

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

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

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

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

user2175183
источник
3
Я оценил информацию о "синхронном поведении".
Хуан Ланус
Я считаю, что вы можете выполнить загрузку скрипта асинхронно. JQuery предоставляет этот параметр для своих запросов ajax. Я не уверен, работает ли он для jsonp или нет. api.jquery.com/jquery.ajax
эран отзап
11

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

matpop
источник
1
+1 за информацию об обратных
звонках
1

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

МДаниял
источник
-1

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

Anoop
источник
Это тоже хорошая статья - blog.algolia.com/jsonp-still-mandatory
Anoop