JSONP跨域原理和jQuery.getJSON用法
JSONP是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问(这仅仅是JSONP简单的实现形式)。本文主要介绍JSONP跨域原理,一起来看。
AD:
JSONP是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问(这仅仅是JSONP简单的实现形式)。JSON系统开发方法是一种典型的面向数据结构的分析和设计方法,以活动为中心,一连串的活动的顺序组合成一个完整的工作进程。
之所以会有跨域这个问题的产生根本原因是浏览器的同源策略限制,理解同源策略的限制同源策略是指阻止代码获得或者更改从另一个域名下获得的文件或者信息。也就是说我们的请求地址必须和当前网站的地指相同。同源策略通过隔离来实现对资源的保护。这个策略的历史非常悠久从Netscape Navigator 2.0时代就开始了。
解决这个限制的一个相对简单的办法就是在服务器端发送请求,服务器充当一个到达第三方资源的代理中继。虽然是用广泛但是这个方法却不够灵活。
另一个办法就是使用框架(frames),将第三方站点的资源包含进来,但是包含进来的资源同样要受到同源策略的限制。
有一个很巧妙的办法就是在页面中使用动态代码元素,代码的源指向服务地址并在自己的代码中加载数据。当这些代码加载执行的时候,同源策略就不会起到限制。但是如果代码试图下载文件的时候执行还是会失败,幸运的是,我们可以使用JSON(JavaScript Object Notation)来改进这个应用。
JSON和JSONP
与XML相比,JSON是一个轻量级的数据交换格式。JSON对于JavaScript开发人员充满魅力的原因在于JSON本身就是Javascript中的对象。
例如一个ticker对象
var ticker = {symbol:'IBM',price:100}
而JSON串就是 {symbol:'IBM',price:100}
这样我们就可以在函数的参数中传递JSON数据。我们很容易掌握在函数中使用动态的JSON参数数据,但是我们的目的并不是这个。
通过使我们的函数能够加载动态的JSON数据,我们就能够处理动态的数据,这项技术叫做 Dynamic Javascript Insertion。
我们看下面的例子:
index.html中
<script type="text/javascript">
function showPrice(data){
alert("Symbol:" + data.symbol + ", Price:" + data.price);
}
var url = "ticker.js"; //Outer JS URL
var script = document.createElement('script');
script.setAttribute('src', url);
//load javascript
document.getElementsByTagName('head')[0].appendChild(script);
</script>
ticker.js中
var data = {symbol:'IBM', price:100};
showPrice(data);
上面的代码通过动态加入Javascript代码,来执行函数加载数据。
正如之前提到过的,同源策略对于动态插入的代码不适用。也就是你可以从不同的域中加载代码,来执行在他们代码中的JSON数据。
这就是JSONP(JSON with Padding)。注意,使用这种方法时,你必须在页面中定义回调函数,就像上例中的showPrice一样。
我们通常所说的JSONP服务(远程JSON服务),实际上就是一种扩展的支持在用户定义函数中包含返回数据的能力。这种方法依赖于必须接受一个回调函数的名字作为参数。
然后执行这个函数,处理JSON数据,并显示在客户页面上。
JQuery的JSONP支持
从JQery 1.2以后,就开始支持JSONP的调用。在另外的一个域名中指定好回调函数名称,你就可以用下面的形式来就加载JSON数据。
url?callback=?
示例:
jQuery.getJSON(url + "&callbak=?", function(data)
{
alert("Symbol:" + data.symbol + ", Price:" + data.price);
});
jquery会在window对象中加载一个全局的函数,当代码插入时函数执行,执行完毕后就会被移除。同时jquery还对非跨域的请求进行了优化,如果这个请求是在同一个域名下那么他就会像正常的Ajax请求一样工作。
上例中我们在动态插入到页面的代码中使用了静态的json数据,虽然完成了依次JSONP返回,但仍不是JSONP服务,因为不支持在URL中定义回调函数名称。下面是一个将其变成JSONP服务的一个方法
服务器端使用PHP。
首先我们来定义接口的规范,就像这样:http://www.mydomain.com/jsonp/ticker?symbol=IBM&callback=showPrice
symbol是请求条件,callback是回调函数名称。
在页面文件中,我们使用JQuery的支持:
//JQuery JSONP Support
var url = "http://www.mydomain.com/api/suggest.php?symbol=IBM&callback=?";
jQuery.getJSON(url, function(data){
alert("Symbol:" + data.symbol + ", Price:" + data.price);
});
在suggest.php中
$jsondata = "{symbol:'IBM', price:120}";
echo $_GET['callback'].'('.$jsondata.')';
再举个.NET webservice 的例子
客户端
$.getJSON(
"http://192.168.0.66/services/WebService1.asmx/ws?callback=?",
{ name: "ff", time: "2pm" },
function(data) { alert(decodeURI(data.msg)) }
);
服务器端
[WebMethod]
public void ws(string name,string time) {
HttpRequest Request = HttpContext.Current.Request;
string callback = Request["callback"];
HttpResponse Response = HttpContext.Current.Response;
Response.Write(callback + "({msg:'this is"+name+"jsonp'})");
Response.End();
}
现在,如果我们想制作一些mashup,或者将第三方的资源整合到一个页面中,我们就很容易想到JSONP的解决方法了。
注意:
JSONP是一个非常强大的构建mashp的方法,可是不是一个解决跨域访问问题的万能药。它也有一些缺点:
第一也是最重要的:JSONP不提供错误处理。如果动态插入的代码正常运行,你可以得到返回,但是如果失败了,那么什么都不会发生。你无法获得一个404的错误,也不能取消这个请求。
另外一个重要的缺点是如果使用了不信任的服务会造成很大的安全隐患。
分享到:
相关推荐
本篇将详细介绍如何解决jQuery跨域问题,涉及的方法包括$.get、$.post和$.getJSON等。 首先,我们需要理解什么是跨域。同源策略是浏览器为保障安全而实施的一项机制,它规定JavaScript只能访问与当前页面同源(协议...
jQuery提供了`.ajax()`和`.getJSON()`两个方法来实现JSONP。下面将详细解释这两个方法以及JSONP的工作原理。 1. **jQuery的`.ajax()`方法:** 在提供的代码示例中,`$.ajax()`方法用于发起一个跨域GET请求。设置`...
在本文中,我们将深入探讨`jQuery.getJSON`的工作原理、使用方法以及如何结合PHP进行数据交换。 ### 1. `jQuery.getJSON` 概述 `jQuery.getJSON`是jQuery AJAX方法的一种,专门用于从指定URL获取JSON格式的数据。...
jQuery的$.getJSON()方法是另一个强大的工具,它是$.ajax()的简化版本,专门用于从服务器获取JSON数据。只需要提供URL和回调函数,jQuery会自动处理JSONP请求(如果需要跨域)以及数据解析。这极大地简化了数据交互...
总之,jQuery通过`$.getJSON()`和JSONP机制为开发者提供了一种简单的方式来实现跨域数据请求,使得在前后端分离的架构中,前端可以轻松地获取和处理来自其他域的数据。虽然有一些限制,但在许多场景下,JSONP仍然是...
在jQuery中,我们可以使用`.ajax()`或`.getJSON()`方法,加上`jsonp`类型和`callback`参数来发起JSONP请求。例如: ```javascript $.ajax({ url: 'http://example.com/data', type: 'GET', dataType: 'jsonp', ...
文章提供了使用原生JavaScript来实现jQuery中的$.getJSON功能的方法,通过创建script标签并通过JSONP技术来绕过同源策略。这种方法可以减少不必要的库依赖,对于那些需要处理少量AJAX请求的简单Web应用尤其有用。...
在jQuery库中,$.post, $.get和$.getJSON是用于执行AJAX(Asynchronous JavaScript and XML)请求的三种主要方法,这些方法使得前端与后端服务器进行异步数据交互成为可能,无需刷新整个页面。接下来,我们将详细...
通过了解 jQuery $.getJSON() 跨域请求的工作原理和示例,我们可以看到跨域请求在Web开发中的实用性和局限性。JSONP 是一个实用的解决方案,特别适合用于那些你没有权限修改服务器响应的场景。但是,由于其只支持 ...
1. **JSONP跨域请求**:通过`$.getJSON`和`callback=?`实现。 2. **jQuery的$.getJSON方法**:异步获取JSON数据,支持跨域。 3. **后端接口设计**:PHP代码接收GET参数,进行业务逻辑处理,返回JSON格式的数据。 4. ...
在使用$.getJSON()进行跨域请求时,虽然这是一种快速实现跨域的方法,但开发者需要考虑数据安全性和服务端支持等因素。对于敏感或大量数据,建议采取更安全的跨域策略,如服务器端设置CORS响应头策略,或者采用代理...
在互联网开发中,jQuery 是一个广泛使用的 JavaScript 库,提供了许多便利的功能,其中包括与服务器进行异步数据交换的 AJAX 方法和 `getJSON` 函数。然而,由于浏览器的安全策略,前端应用不能随意地从不同源获取...
在跨域请求中,特别是GET请求,我们需要将数据附加到URL上,这时`jquery.param()`方法就非常有用。它可以将JavaScript对象转换为URL友好的格式,便于通过URL传递数据。 跨域问题通常发生在不同源的网页尝试交换信息...
在jQuery中,我们可以使用`$.ajax()`或`$.getJSON()`方法。当设置`dataType`为'jsonp'时,jQuery会自动处理JSONP请求。JSONP是一种绕过同源策略的方法,它通过在目标服务器上返回一个JavaScript函数调用,将数据作为...
在Web开发中,由于浏览器的安全策略,JavaScript通常不能直接进行跨域请求,但jQuery提供了$.ajax和$.getJSON方法,通过JSONP(JSON with Padding)技术来实现在不同源之间获取JSON数据。下面将详细介绍如何使用...
$.getJSON 是 jQuery 提供的一种 AJAX 方法,用于向服务器请求 JSON 数据并在数据加载成功后执行回调函数。这个方法特别适用于跨域请求,因为 JSONP(JSON with Padding)协议允许绕过同源策略,使得 JavaScript ...
例如,$.getJSON方法在执行跨域请求时,会自动检测请求URL中是否包含callback参数,如果包含,则会自动以该参数的值作为回调函数名,并且Jquery会动态生成一个新的callback函数名,确保每次请求的回调函数名是...
例如,jQuery中的`$.ajax`或`$.getJSON`提供了JSONP支持。对于服务器端,开发者需要根据客户端传递的回调函数名动态构建响应内容。 5. 应用场景: JSONP常用于前端需要获取不同源数据的场景,如嵌入第三方API、...
以上就是使用getJSON解决跨域问题的基本方法,以及相关的JSONP和CORS机制。在实际开发中,我们需要根据项目需求和服务器支持情况选择合适的跨域策略。同时,对于“请求测试”这个文件名,可能是用于测试不同跨域解决...
在处理JSONP(JSON with Padding)格式的跨域请求时,$.ajax()和$.getJson()方法也支持JSONP回调函数的自动处理。需要注意的是,JSONP请求不受同源策略限制,因此可以用来从其他域请求数据,但安全性和数据保护仍然...