代码之家  ›  专栏  ›  技术社区  ›  patricksweeney

返回XML时使用JSONP

  •  13
  • patricksweeney  · 技术社区  · 14 年前

    我之前问过 question 这绝对有帮助,让我知道JSONP。但是,我看到必须指定jsonp作为数据类型。现在,据我所知,这是返回数据的返回类型,它是XML。XML可以使用JSONP返回,还是仅限于以JSONP格式返回?谢谢!

    3 回复  |  直到 8 年前
        1
  •  13
  •   Nick Craver    14 年前

    由于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
  •  2
  •   Anurag    13 年前

    其思想是从服务器发回可执行代码。编写jquery插件或扩展Ajax函数以返回XML字符串作为函数参数。

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

    插件将把这个字符串解析为XML并返回到实际的回调。就您的回调而言,它不知道 string -> xml 转换过程。

    这是现有的 implementation .

    最理想的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
  •  -3
  •   Derozer    10 年前

    您可以在javascript函数中在 /* comment */ 并用方法将此函数转换为文本 函数名.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);
    }