这是问题。我正在通过JavaScript/jQuery中的Ajax调用提取Gmail联系人:
function getUserInfo() {
var xml_parse = "";
$.ajax({
url: SCOPE + '?max-results=9999&access_token=' + acToken
data: null,
success: function (resp) {
xml_parse = $.parseXML(resp);
callGmailHelperWebService(xml_parse);
},
dataType: "jsonp"
});
}
function callGmailHelperWebService(xml_parse) {
GmailHelperService.ConvertXMLToList(xml_parse, onSuccess, onFailed, null);
}
因此,如您所见,如果最初的Ajax调用成功,我调用一个函数,该函数调用位于保存服务器上的Web服务作为我的项目(实际上,它是项目的一部分)。
我的Web服务(GmailHelperService)已正确连接,因为我绝对可以在其他地方称呼它(例如,在此Ajax调用后,就可以)。但是,当我尝试在AJAX调用的"成功"部分中称呼它时,我会收到以下错误:
未接收的错误:Security_err:DOM异常18
我的理论是,这与跨域问题有关,但我不明白为什么。而且我当然不知道如何解决此问题。
我感谢任何帮助。
JSONP是一种数据传输方法,涉及以这种格式发送您的数据:
callback({"foo":"bar"});
您可以看到,这不是XML。它是用回调方法包裹的JSON,该方法将在加载请求时将执行,因此可以使用<script>
标签请求。
您不能简单地将数据类型更改为JSONP并返回XML,希望它能正常工作。XML!= JSONP。但是,您可以在JSONP中返回XML,例如callback({"xml","... xml string here "})
,但请注意所有JSON键和值必须用双引号包裹,内部引号需要适当处理。
如果您的请求是相同的域请求(相同协议,相同的子域,相同的域和相同的端口),则如果您返回XML,则可以将数据类型更改为" XML"。否则,您需要设置一个代理脚本才能为您获取XML,或者您的WebService返回JSONP。
例如,以下URL彼此视为跨域。
http://example.com
http://www.example.com
https://example.com
https://www.example.com
http://example.com:8080
即使它们在同一服务器上,上述所有URL也将被视为跨域。