返回XML时的JSONP dataType

时间:2013-03-05 16:21:03

标签: ajax jsonp

我正在玩JSONP。我理解(也许)这个概念,但在实施方面有点落后。

我所拥有的是一个Web服务器,它通过URL字符串生成XML结果。正如我研究的那样,JSONP应该解决跨域问题,但预期的返回数据仍然是JSON数组。因此,如果服务器返回XML,我如何让我的ajax脚本识别它并能够解析它?

这是我的代码:

var usdaurl = 'http://eligibility.sc.egov.usda.gov/eligibility/eligibilityservice?eligibilityType=Property&requestString=<?xml version="1.0"?><Eligibility xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="/var/lib/tomcat5/webapps/eligibility/Eligibilitywsdl.xsd"><PropertyRequest StreetAddress1="'+street+'" StreetAddress2="" StreetAddress3="" City="'+city+'" State="'+state+'" County="" Zip="'+zip+'" Program="RBS"></PropertyRequest></Eligibility>';
var clbk = function(xml){
          var usda = $('Property').attr('Eligibility');
       };

$.ajax({
    url: usdaurl,
    dataType: 'jsonp',
    jsonpCallback: 'clbk'
});

此外,我得到的错误是XML响应中未识别的字符。

Uncaught SyntaxError: Unexpected token < 

2 个答案:

答案 0 :(得分:1)

您要求的服务必须支持

jsonp,否则SOP将毫无用处。有这种误解,如果你想做一个跨原始请求,你只需使用jsonp。 jsonp(也是CORS)是供应商允许用户在没有SOP限制的情况下获取其内容的方法,对于任何人来说都不是通过同源策略的方式。

答案 1 :(得分:0)

你可以设置一个代理来串行化xml / html / soap / whatever并将它包装在一个回调中。

这是一个使用cgi shell脚本的例子(我总是gzipping输出,因为99.9%支持javascript的浏览器也支持gzip)

#!/bin/sh
CB=${QUERY_STRING%%&*}
URL=${QUERY_STRING#*&}
case "$CB" in
    callback=*)
        printf "Content-Encoding: gzip\nContent-type: application/javascript\r\n\r\n"
        while ([ ! "$ONCE" ])   do
            printf "${CB##*=}(\""
            wget --no-check-certificate -U "NetSurf/2.9 (Linux; i686)" -T 20 -O - "$URL" \
                | tr -c [\ -~] " " |sed 's/[\]/\\\\/g;s/["]/\\"/g'
            printf "\")"
            ONCE=1
        done | gzip -9fc
    ;;
    *)exit;;
esac

这是一个示例用法,假设您的服务器位于localhost,脚本位于/cgi-bin/xml2jsonpgz.cgi(busybox的httpd的典型位置)它使用回调中返回的字符串将整个uri楔入{ {1}}标签,但您可以通过它来获取您想要的DOM。

<div>

基本用法是:设置src = urlOfCgiScript +“?callback =”+ callBackName +“&amp;”+ url 并设置回调来处理字符串。

您可以使用json数据执行相同的操作,但使用较少复杂的转义。