Использование JSONP при возврате XML
Я спросил ранее question, который был определенно полезен и дал мне знать о JSONP. Однако я вижу, что я должен указать JSONP как тип данных. Теперь, насколько я знаю, это возвращаемый тип возвращаемых данных, который будет представлять собой XML. Может ли XML быть возвращен с использованием JSONP или я ограничу его возвратом в формате JSONP? Спасибо!
Ответы
Ответ 1
Вы ограничены 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
Идея состоит в том, чтобы отправить обратно исполняемый код с сервера. Напишите плагин 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 пока не поддерживается широко.
Ответ 3
Вы можете написать XML в функции Javascript внутри /* comment */
и преобразовать эту функцию в текст с помощью метода functionname.toString() и разбора текста между "/*
" и "*/
" с функцией JSONP, которая работает во всех старых браузерах. Пример 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);
}