Требует ли JSONP модификаций сервера?

Я понимаю, что jsonp - это способ обойти ту же политику происхождения. Вы в основном ссылаетесь на конечную точку обслуживающего сервера json в теге сценария, поскольку теги сценария не подпадают под действие политики SO.

Мой вопрос: если на сервере есть конечная точка, обслуживающая json, необходимы ли какие-либо модификации на сервере для использования jsonp в клиенте?

Думаю, нет, но хочу быть уверенным ....


person hvgotcodes    schedule 21.07.2010    source источник


Ответы (1)


Да, JSONP немного отличается при рендеринге, поэтому ваш сервер должен его поддерживать.

JSON выглядит так:

{ "name": "value" }

Тогда как JSONP выглядит так:

functionName({ "name": "value" });

Если все, что вы используете, поддерживает это, вы защищены, но это не то же самое, что поддержка только JSON. Когда сервер получает запрос, например: http://example.com/json?callback=functionName, вы должны отобразить указанное выше, потому что на странице это выглядит так:

<script type="text/javascript" src="http://example.com/json?callback=functionName"></script>

Это означает, что что-то, что выполняется, необходимо вернуть, в качестве иллюстрации это действительно:

<script type="text/javascript">
  functionName({ "name": "value" });
</script>

Если бы ваш сервер не поддерживал JSONP, это было бы эффективно:

<script type="text/javascript">
  { "name": "value" }
</script>

... и вы получите синтаксические ошибки, поскольку это недопустимый JavaScript.

person Nick Craver    schedule 21.07.2010
comment
а ваш код js должен реализовывать functionName? Нужно ли оценивать json, чтобы получить объекты js? - person hvgotcodes; 21.07.2010
comment
@hvgotcodes - Да, у клиента есть эта функция (например, jQuery по умолчанию создает ее динамически). JSON передается в функцию (JSON - это допустимая объектная буквальная запись, только ее подмножество), поэтому eval() делать не нужно. - person Nick Craver; 21.07.2010
comment
Я не понимаю, почему вам не нужно его оценивать. Независимо от jsonp, разве большинство библиотек js не проверяют json, возвращаемый через xhrs, чтобы получить фактические объекты js, которые представляет json? - person hvgotcodes; 21.07.2010
comment
@hvgotcodes - Нет, он не выполняется через JavaScript (или XmlHttpRequest), это буквально элемент <script>, добавленный на страницу ... он загружается, как любой другой файл .js. Это нормальный GET ... поэтому он разрешен междоменным, а обычные запросы AJAX - нет. В случае JSON ответ будет либо eval'd, либо лучше, используется "родной" JSON.parse(), реализованный в нескольких браузерах .... но JSONP - это совсем другое дело. - person Nick Craver; 21.07.2010
comment
Насколько я понимаю, решение о том, как обрабатывать любое содержимое тега скрипта (т.е. анализировать ли его на уровне собственного кода или предлагать его высокоуровневой функции JavaScript eval) остается за разработчиком браузер. - person Marco Faustinelli; 09.03.2017