我正在玩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 <
答案 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数据执行相同的操作,但使用较少复杂的转义。