这是问题所在。我正在通过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服务(事实上,它是项目的一部分)。
我的网络服务(GmailHelperService)已正确连接,因为我可以在其他地方称呼它(例如,在此ajax调用之后)。但是,当我尝试在ajax调用的“成功”部分内调用它时,我收到以下错误:
未捕获错误:SECURITY_ERR:DOM异常18
我的理论是,这与跨域问题有关,但我无法理解为什么。我当然无法弄清楚如何解决这个问题。
我很感激任何帮助。
答案 0 :(得分:0)
JSONP是一种数据传输方法,涉及以这种格式发送数据:
callback({"foo":"bar"});
如您所见,这不是xml。它是JSON包装在一个回调方法中,它将在请求完成加载时执行,从而允许它是跨域的,因为它可以使用<script>
标记进行请求。
您不能简单地将dataType更改为JSONP并返回xml,期望它能够正常工作。 XML!= JSONP。但是你可以在jsonp中返回XML,例如callback({"xml","... xml string here "})
,但要注意引号,所有json键和值必须用双引号括起来,内引号需要妥善处理。
如果您的请求是相同的域请求(相同的协议,相同的子域,相同的域和相同的端口),那么如果要返回XML,则可以将dataType更改为“XML”。否则,您需要设置代理脚本以获取xml,或让您的Web服务返回JSONP。
例如,以下网址都被视为彼此跨域。
http://example.com
http://www.example.com
https://example.com
https://www.example.com
http://example.com:8080
以上所有网址都会被视为跨域,即使它们位于同一台服务器上。