Использование JSONP при возврате XML - PullRequest
13 голосов
/ 08 августа 2010

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

Ответы [ 3 ]

13 голосов
/ 08 августа 2010

Вы ограничены 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 - ваш единственный вариант, если вы не написали прокси-страницу на своем сайте, которая не нарушала правила политики того же происхождения и использовали его в качестве прокси для извлечения XML через.

2 голосов
/ 08 августа 2010

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

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

Плагин будет анализировать эту строку в XML и возвращать ее обратно в ваш реальный обратный вызов.Что касается вашего обратного вызова, то он не знает о процессе преобразования string -> 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 пока не поддерживается широко.

0 голосов
/ 19 февраля 2015

Вы можете написать XML внутри функции Javascript в /* comment */ и преобразовать эту функцию в текст с помощью метода functionname.toString () и разбирать текст между "/*" и "*/" с помощью Функция JSONP callback , которая работает во всех старых браузерах. Пример xml_via_jsonp.js :

function myfunc()
{/*
<xml>
<div class="container">
        <div class="panel panel-info col-lg-10 col-lg-offset-1 added-panel">
            <div class="panel-heading">Random1 - Random2</div>
            <div class="panel-body">
                <div>Random3</div>
            </div>
        </div>
    </div>
</xml>
*/}

function callback(func)
{
var myhtml = func.toString();
var htmlstart = myhtml.indexOf('/*');
var htmlend = myhtml.lastIndexOf('*/');
return myhtml.substr(htmlstart+2, htmlend-htmlstart-2);
}
...