Использование JSONP при возврате XML

Я задал более ранний вопрос , который определенно был полезен и дал мне знать о JSONP. Тем не менее, я вижу, что я должен указать JSONP в качестве типа данных. Теперь, насколько я знаю, это тип возвращаемых данных, который будет XML. Может ли XML быть возвращен с использованием JSONP или я ограничен возвращением в формате JSONP? Спасибо!

13
задан Community 23 May 2017 в 12:34
поделиться

2 ответа

Вы ограничены JSONP (а не XML) из-за того, как он работает. JSONP превращается в следующее:

<script src="myPage?callback=myFunction" type="text/javscript">

Поэтому, когда вы берете содержимое, это эффективно делает следующее:

<script type="text/javascript">
  myFunction({ data: value, data2: value2 });
</script>

То, что возвращается, это фактически работающий JavaScript, поэтому это не может быть XML, вы получите все виды синтаксических ошибок, точно как вы бы сделали это:

<script type="text/javascript">
  <elem>
    <data>value</data>
    <data2>value2</data2>
  </elem>
</script>

Как вы можете себе представить, парсеру JavaScript это не очень понравится, и он не знает, что с этим делать. jQuery может разобрать XML в большинстве случаев без проблем, но если вы используете JSONP и это для междоменных запросов... ну, JSONP - ваш единственный вариант, если только вы не написали прокси-страницу на своем сайте, которая не нарушает правила политики same-origin, и не использовали ее как прокси для получения XML.

13
ответ дан 2 December 2019 в 00:57
поделиться

Идея заключается в для отправки исполняемого кода с сервера. Напишите плагин jQuery или расширьте функцию ajax, чтобы она возвращала строку XML в качестве параметра функции.

myCallback("
  <root>
    <person>
      <first>John</first>
      <last>Doe</last>
    </person>
  </root>")

Плагин проанализирует эту строку в XML и вернет ее обратно в ваш реальный обратный вызов. Что касается вашего обратного вызова, он не знает о процессе преобразования строка -> xml .

Вот существующая реализация .

Самым идеальным интерфейсом для этого с jQuery будет,

$.ajax({
    url: 'http://example.com/resource?type=xml',
    dataType: 'xmlp',
    success: function(xml) { .. }
});

, но поскольку возиться и переписывать jQuery.ajax проблематично, вы можете написать это как отдельный плагин с пространством имен, который будет использовать ] getScript внизу.

$.myNamespace.ajax({
    ..
});

Чтобы это работало, вам потребуется контроль над сервером. Сервер должен знать, что XML запрошен, и ответить вызовом функции, которая содержит строку XML в качестве параметра. Предполагая, что имя обратного вызова, которое вы отправили на удаленный сервер, было foo , сервер должен будет ответить примерно так:

foo("<names><name>..</name></names>")

Я думаю, если бы вы использовали браузер, поддерживающий E4X, то не было бы нужно обернуть XML в строку. Сервер может просто вернуть XML в качестве аргумента функции обратного вызова:

foo(
  <names>
    <name>John Doe</name>
  </names>
)

Но, к сожалению, E4X еще не получил широкой поддержки.

2
ответ дан 2 December 2019 в 00:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: