使用jQuery进行跨域ajax JSONP请求

16 浏览
0 Comments

使用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但我没有得到任何输出...请有人帮忙...

0
0 Comments

问题的原因是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`未定义(未定义)。

0
0 Comments

出现的原因:由于浏览器的同源策略限制,直接在前端使用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数据。另外,也可以通过使用第三方代理服务器来实现跨域请求。

0
0 Comments

跨域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数据。

0