0

我正在玩 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 < 
4

2 回答 2

1

jsonp has to be supported by the service you are requesting from, otherwise SOP would be totally useless. There is this misconception that if you want to make a cross origin request you just use jsonp. jsonp(also CORS) is a method for providers to allow users to get their content without the SOP restriction, its not a way for anyone to just by pass Same origin policy.

于 2013-03-05T16:29:45.357 回答
0

您可以设置一个代理来对 xml/html/soap/whatever 进行字符串化并将其包装在回调中。

这是一个使用 cgi shell 脚本的示例(我总是使用 gzip 压缩输出,因为 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 楔入一个<div>标签,但是您那么它可以在 DOM 上做你想做的事。

<html><head><title>test</title></head><body><div id="notaniframe"></div>
<script>
    function dummy(data){alert(data);document.getElementById("notaniframe").innerHTML=data}
    Loaded=0
    setTimeout(function(){if(!Loaded)alert("load failed")},30000);
</script>
<script onload='Loaded=1;alert("loaded")' src="http://localhost/cgi-bin/xml2jsonpgz.cgi?callback=dummy&http://stackoverflow.com"></script>
</body></html>

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

您可以对 json 数据做同样的事情,但转义的复杂性较低。

于 2013-03-10T03:32:54.567 回答