Отже, JSONP чи CORS? [зачинено]


111

Мій WebAPI був розгорнутий в інтранетному середовищі. Це означає, що безпека не хвилювала мене.

Здається, що CORS набагато привітніший до клієнта та простіший у виконанні .

Будь-які інші проблеми, які я, можливо, пропустив?

Відповіді:


144

Це досить широке запитання, і воно може гарантувати собі вікі. У Google також є досить багато щодо 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 на стороні клієнта.


3
Якщо ви підтримуєте IE8 та IE9, він також може виключати CORS через те, що тип вмісту змушений "текст / звичайно", див. Пункт (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 повинен бути динамічним навіть із вмістом, що запам'ятовується.

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

JSONP може бути лише GET. І як з CORS, ви можете використовувати будь-який метод.


3
Я оцінив інформацію про "синхронну поведінку".
Хуан Ланус

Я вважаю, ви можете зробити сценарій завантаження асинхронним способом. JQuery надає цей параметр у своїх запитах на ajax. Я не впевнений, працює він для jsonp чи ні. api.jquery.com/jquery.ajax
eran otzap

11

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


1
+1 для інформації про зворотні дзвінки
звичайний

1

Згідно з весняною документацією, JSONP - це злом, а не належне рішення для розподілу ресурсів між походженнями. Тож якщо безпека не стосується вас, просто перевірте походження домену на своєму сервері та додайте заголовок відповіді Access-Control-Allow-Origin Response.


-1

Наш веб-API не працював на Safari (iOS 9.1) з автентифікацією Windows. Він працював із Safari + iOS 8.4. Коли ми перейшли на JSONP, Safari знову почав працювати. Перевірте це посилання для отримання додаткової інформації.


Це також хороша стаття - blog.algolia.com/jsonp-still-mandatory
Anoop
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.