В этой статье мы рассмотрим, что такое JSONP, его недостатки и некоторые альтернативы JSONP.

Возможно, вы столкнулись с ситуациями, когда вы выполняете вызов API из одного источника в другой. Например, у нас есть страница, обслуживаемая с localhost: 3000, которая вызывает API с localhost: 8000.

Примечание. Мы будем называть localhost: 3000 нашим клиентским сервером. Мы будем называть localhost: 8000 нашим API-сервером.

Но мы видим эту пугающую ошибку.

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

JSONP (JSON с заполнением) позволяет решить эту проблему с политикой одинакового происхождения. Давайте посмотрим, как появился JSONP.

Техническое погружение

Мы можем запустить код JavaScript внутри нашего HTML-файла с тегами <script>.

Мы можем переместить наш код JavaScript в отдельный файл JavaScript и ссылаться на него с помощью нашего тега сценария. Наша веб-страница теперь выполняет внешний сетевой вызов для файла JavaScript. Но функционально все работает так же.

Файл Javascript не обязательно должен иметь расширение js. Браузер будет интерпретировать контент как JavaScript, если Content-Type ответа - JavaScript. (text/javascript, application/javascript).
Большинство серверов позволяют вам устанавливать тип контента. В Экспрессе вам нужно:

Тег <script> может ссылаться на URL без расширения js.

Теги скриптов не ограничиваются Политикой одинакового происхождения. Существуют и другие теги, такие как теги <img> и <video>, которые не ограничиваются Политикой одинакового происхождения. Таким образом, наш JavaScript может иметь другое происхождение.

Код внутри файла JavaScript имеет доступ ко всему, что находится в области видимости. Вы можете использовать функции, определенные ранее в вашем HTML-файле.

Вы можете передавать аргументы, как при обычном вызове функции.

В приведенном выше примере мы передали жестко запрограммированную строку. Но мы также можем передавать данные из базы данных. Наш сервер API может создать файл JavaScript с этой динамической информацией.

Вот что такое JSONP. Вместо использования fetch или XMLHttpRequest для вызова API для получения данных мы использовали тег <script>. Поскольку мы использовали тег <script>, мы смогли обойти политику одинакового происхождения.

Как я уже упоминал выше, JSONP означает JSON с заполнением. Что означает набивка? Обычные ответы API возвращают JSON. В ответах JSONP мы возвращаем ответ JSON, окруженный (или дополненный) функцией JavaScript.

Большинство серверов позволяют вам указать имя вашей функции заполнения.

Сервер принимает имя вашей функции заполнения в качестве запроса. Он вызывает вашу функцию заполнения с данными JSON в качестве аргумента.

Вы не ограничены передачей имен функций в качестве обратного вызова. Вы можете передать встроенный JavaScript в свой запрос.

Я не придумал причины для этого.

Альтернативы использованию JSONP

Официальной спецификации JSONP нет. Я думаю о JSONP как о взломе.

<script> теги могут отправлять только запросы GET. Таким образом, JSONP может делать только запросы GET.

Совместное использование ресурсов между разными источниками имеет официальную спецификацию и является предпочтительным способом обойти политику одного происхождения.

Вы можете включить совместное использование ресурсов между источниками, добавив заголовок в наш ответ.

Это означает, что все источники могут использовать этот ресурс, не опасаясь Политики одинакового происхождения.

Однако иногда у вас нет контроля над серверным кодом. Вы не сможете включить заголовок Access-Control-Allow-Origin. Альтернативное решение - сделать так, чтобы ваш собственный прокси-сервер выполнял за вас запрос на другой источник. Политика Same-Origin применяется только к браузеру. Серверы могут делать запросы из разных источников.

Вопросов? Комментарии? Пожалуйста, оставьте сообщение ниже.

Ресурсы