使用jQuery进行跨域ajax JSONP请求
使用jQuery进行跨域ajax JSONP请求
我想用以下代码使用jquery ajax解析JSON数组数据:\n
Sample
\n我的JSON数据是:\n{\"Data\": [{\"Address\":\"chetpet\",\"FirstName\":\"arulmani\",\"Id\":1,\"LastName\":\"sathish\",\"City\":\"chennai\"},{\"Address\":\"ramapuram\",\"FirstName\":\"raj\",\"Id\":2,\"LastName\":\"nagu\",\"City\":\"chennai\"},{\"Address\":\"ramapuram\",\"FirstName\":\"raj\",\"Id\":2,\"LastName\":\"nagu\",\"City\":\"chennai\"},{\"Address\":\"ramapuram\",\"FirstName\":\"ramaraj\",\"Id\":3,\"LastName\":\"rajesh\",\"City\":\"chennai\"},{\"Address\":\"ramapuram\",\"FirstName\":\"yendran\",\"Id\":3,\"LastName\":\"sathi\",\"City\":\"chennai\"}],\"Code\":true}\n
\n但我没有得到任何输出...请有人帮忙...
问题的原因是JSON数据中的属性名大小写不匹配,导致无法正确访问数据。解决方法是将属性名改为正确的大小写形式。
具体而言,代码中的`xml.Data[0].City`应改为`xml.data[0].City`;`result = xml.Code`应改为`result = xml.code`。
另外,代码中的`City`和`Code`也是大小写错误的,应改为`city`和`code`。
此外,代码中的`dataType`应为`json`,而不是`jsonp`。
如果尝试直接浏览URL,会发生什么情况?在浏览器的错误控制台中会显示什么错误?
在直接浏览URL时,会出现JSON数据中有意外的`:`标记的错误。但是这是使用JSON数组的正确方式,对吗?
如果将`dataType`改为`json`而不是`jsonp`,会出现以下错误:
1. XMLHttpRequest无法加载`http://10.211.2.219:8080/SampleWebService/sample.do`。Origin `localhost:3555`不被`Access-Control-Allow-Origin`允许访问。
2. GET `http://10.211.2.219:8080/SampleWebService/sample.do`未定义(未定义)。
出现的原因:由于浏览器的同源策略限制,直接在前端使用ajax请求跨域的数据是不被允许的。因此,需要使用一种特殊的技术来实现跨域请求,即JSONP(JSON with Padding)。
解决方法:可以使用jQuery的ajax函数,并结合JSONP来实现跨域请求。在ajax函数中,设置dataType为"jsonp",并且添加crossDomain为true的选项。这样,jQuery会自动将请求以JSONP的方式发送,并通过动态创建script标签的方式获取跨域的响应数据。
以下是使用jQuery实现JSONP跨域请求的示例代码:
$.ajax({ url: url, dataType: 'jsonp', crossDomain: true, success: function(data) { console.log(data); } });
需要注意的是,服务器端需要对跨域请求进行特殊处理,即返回一个以函数调用形式包裹的JSON数据,例如:
callbackFunction({ "name": "John", "age": 30 });
其中callbackFunction为前端定义的回调函数,用于处理服务器返回的数据。
另外,如果服务器不支持JSONP,也可以通过使用第三方代理服务器来实现跨域请求。在这种情况下,需要将请求发送到代理服务器,由代理服务器再转发请求到目标服务器,并将目标服务器的响应返回给前端。这种方法可以绕过浏览器的同源策略限制,但会增加请求的延迟和服务器的负载。
通过使用jQuery的ajax函数,设置dataType为"jsonp"并添加crossDomain选项,可以实现在前端进行跨域请求。在服务器端,需要对请求进行特殊处理,返回一个以函数调用形式包裹的JSON数据。另外,也可以通过使用第三方代理服务器来实现跨域请求。
跨域AJAX调用是指在不同的Web应用程序路径中进行调用。要进行JSONP,您的Web服务必须支持方法注入。
如果您的Web服务和Web应用程序托管在同一个域中,那么您的代码应该是正常工作的。
当您使用dataType: 'jsonp'
进行$.ajax
调用时,jQuery实际上会向查询URL添加一个新的参数。
例如,如果您的URL是http://10.211.2.219:8080/SampleWebService/sample.do
,那么jQuery将添加?callback={some_random_dynamically_generated_method}
。
这种方法实际上是附加在window
对象上的一个代理。它看起来类似于这样:
window.some_random_dynamically_generated_method = function(actualJsonpData) { //这里实际上引用了$.ajax中提到的成功函数 //所以它只是这样调用成功方法: successCallback(actualJsonData); }
总结:
您的客户端代码看起来很好。但是,您必须修改您的服务器代码,将您的JSON数据包装在通过查询字符串传递的函数名称中。例如:
如果您的查询字符串是
?callback=my_callback_method
那么您的服务器必须像这样包装响应数据:
my_callback_method({your json serialized data});
我在这里为这个问题写了一个答案:Loading cross domain html page with jQuery AJAX – 最后一个,支持https
问题:在$.ajax的url属性中是否可以提到json文件?url属性支持的文件扩展名是什么?只要返回带有填充js回调的任何内容吗?
这就是为什么我在控制台中收到这个错误:Uncaught SyntaxError: Unexpected token :
,错误中有一个链接,点击后显示JSON数据。