`
iwebcode
  • 浏览: 2010869 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

(跨域)JSONP原理 $.getJSON 用法

 
阅读更多

简介符合Web2.0特征的众多网站一个明显的特点就是采用Ajax。Ajax提供了在后台提交请求访问数据的功能。其实现主要使用的是 XMLHttpRequest函数,这个函数允许客户端的Javas<wbr>cript 发送到服务器端的HTTP请求并获得返回数据。Ajax同时也是目前众多的Mashup背后</wbr>

简介
符合Web2.0特征的众多网站一个明显的特点就是采用Ajax。Ajax提供了在后台提交请求访问数据的功能。其实现主要使用的是XMLHttpRequest函数,这个函数允许客户端的Javas<wbr>cript<br> 发送到服务器端的HTTP请求并获得返回数据。Ajax同时也是目前众多的Mashup背后的驱动力量,他们都利用Ajax来聚合不同来源的信息。<br><br> 理解同源策略的限制<br> 同源策略是指阻止代码获得或者更改从另一个域名下获得的文件或者信息。也就是说我们的请求地址必须和当前网站的地指相同。同源策略通过隔离来实现对资源的保护。这个策略的历史非常悠久<br> 从Netscape Navigator 2.0时代就开始了。<br><br> 解决这个限制的一个相对简单的办法就是在服务器端发送请求,服务器充当一个到达第三方资源的代理中继。虽然是用广泛但是这个方法却不够灵活。<br> 另一个办法就是使用框架(frames),将第三方站点的资源包含进来,但是包含进来的资源同样要受到同源策略的限制。<br><br> 有一个很巧妙的办法就是在页面中使用动态代码元素,代码的源指向服务地址并在自己的代码中加载数据。当这些代码加载执行的时候,同源策略就不会起到限制。但是如果代码试图下载文件的时候<br> 执行还是会失败,幸运的是,我们可以使用JSON(JavaS<wbr>cript Object Notation)来改进这个应用。<br><br> JSON和JSONP<br> 与XML相比,JSON是一个轻量级的数据交换格式。JSON对于JavaS<wbr>cript开发人员充满魅力的原因在于JSON本身就是Javas<wbr>cript中的对象。<br> 例如一个ticker对象<br> var ticker = {symbol:'IBM',price:100}<br> 而JSON串就是 {symbol:'IBM',price:100}<br> 这样我们就可以在函数的参数中传递JSON数据。我们很容易掌握在函数中使用动态的JSON参数数据,但是我们的目的并不是这个。<br> 通过使我们的函数能够加载动态的JSON数据,我们就能够处理动态的数据,这项技术叫做 Dynamic Javas<wbr>cript Insertion。<br> 我们看下面的例子<br> index.html中<br> &lt;script type="text/javas<wbr>cript"&gt;<br> function showPrice(da<wbr>ta){<br> alert("Symbol:" + da<wbr>ta.symbol + ", Price:" + da<wbr>ta.price);<br> }<br><br> var url = "ticker.js"; //Outer JS URL<br> var script = document.createElement('script');<br> script.setAttribute('src', url);<br><br> //load javas<wbr>cript<br> document.getElementsByTagName('head')[0].appendChild(script);<br> &lt;/script&gt;<br> ticker.js中<br> var da<wbr>ta = {symbol:'IBM', price:100};<br> showPrice(da<wbr>ta);<br><br> 上面的代码通过动态加入Javas<wbr>cript代码,来执行函数加载数据。<br> 正如之前提到过的,同源策略对于动态插入的代码不适用。也就是你可以从不同的域中加载代码,来执行在他们代码中的JSON数据。<br> 这就是JSONP(JSON with Padding)。注意,使用这种方法时,你必须在页面中定义回调函数,就像上例中的showPrice一样。<br><br> 我们通常所说的JSONP服务(远程JSON服务),实际上就是一种扩展的支持在用户定义函数中包含返回数据的能力。这种方法依赖于必须接受一个回调函数的名字作为参数。<br> 然后执行这个函数,处理JSON数据,并显示在客户页面上。<br><span style="color:#ff0000"><br><span style="font-size:12px">JQuery的JSONP支持<br><br> 从JQery 1.2以后,就开始支持JSONP的调用。在另外的一个域名中指定好回调函数名称,你就可以用下面的形式来就加载JSON数据。<br> url?callback=?<br><br> 示例:<br> jQuery.getJSON(url + "&amp;callbak=?", function(da<wbr>ta){<br> alert("Symbol:" + da<wbr>ta.symbol + ", Price:" + da<wbr>ta.price);<br> });<br> jquery会在window对象中加载一个全局的函数,当代码插入时函数执行,执行完毕后就会被移除。同时jquery还对非跨域的请求进行了优化,如果这个请求是在同一个域名下<br> 那么他就会像正常的Ajax请求一样工作。</wbr></wbr></wbr></span></span><br><br> 上例中我们在动态插入到页面的代码中使用了静态的json数据,虽然完成了依次JSONP返回,但仍不是JSONP服务,因为不支持在URL中定义回调函数名称。下面是一个将其变成JSONP服务的一个方法<br> 服务器端使用PHP。<br><br> 首先我们来定义接口的规范,就像这样:http://www.mydomain.com/jsonp/ticker?symbol=IBM&amp;callback=showPrice<br> symbol是请求条件,callback是回调函数名称。<br><br> 在页面文件中,我们使用JQuery的支持:<br> //JQuery JSONP Support<br> var url = "http://www.mydomain.com/api/suggest.php?symbol=IBM&amp;callback=?";<br> jQuery.getJSON(url, function(da<wbr>ta){<br> alert("Symbol:" + da<wbr>ta.symbol + ", Price:" + da<wbr>ta.price);<br> });<br><br> 在suggest.php中<br> $jsondata = "{symbol:'IBM', price:120}";<br> echo $_GET['callback'].'('.$jsondata.')';</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

再举个.NET webservice的例子

客户端

$.getJSON(

"http://192.168.0.66/services/WebService1.asmx/ws?callback=?",

{ name: "ff", time: "2pm" },

function(da<wbr>ta) { alert(decodeURI(da<wbr>ta.msg)) }</wbr></wbr>

);

服务器端

[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服务
既然我们已经知道如何使用JSONP,那么我们也就可以使用一些现有的JSONP服务了,下面是一些例子:
Digg API:http://services.digg.com/stories/top?appkey=http%3A%2F%2Fmashup.com&type=javas<wbr>cript&amp;callback=?<br> Geonames API:http://www.geonames.org/postalCodeLookupJSON?postalcode=10504&amp;country=US&amp;callback=?<br> Flickr API:http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&amp;tagmode=any&amp;format=json&amp;jsoncallback=?<br><br> 注意:<br> JSONP是一个非常强大的构建mashp的方法,可是不是一个解决跨域访问问题的万能药。它也有一些缺点<br> 第一也是最重要的:JSONP不提供错误处理。如果动态插入的代码正常运行,你可以得到返回,但是如果失败了,那么什么都不会发生。你无法获得一个404的错误,也不能取消这个请求<br> 另外一个重要的缺点是如果使用了不信任的服务会造成很大的安全隐患。 </wbr>

分享到:
评论

相关推荐

    jQuery使用JSONP实现跨域获取数据的三种方法详解

    本文实例讲述了jQuery使用JSONP实现跨域获取数据的三种方法。分享给大家供大家参考,具体如下: 第一种方法是在ajax函数中设置dataType为’jsonp’ $.ajax({ dataType: 'jsonp', url: '...

    JSONP实现Ajax跨域访问

    主要从三方面来通过jsonp来实现ajax跨域问题: 1.javascript方法 2.jquery $.ajax方法 3.jquery $.getJSON方法 不看会后悔的!

    jquery下利用jsonp跨域访问实现方法.docx

    jquery下利用jsonp跨域访问实现方法.docx

    jquery ajax中使用jsonp的限制解决方法

    jsonp 解决的是跨域 ajax 调用...今天,发现 jsonp 的另外一个限制(在jquery ajax的场景下) —— 不会触发 $.ajax 的error callback,示例代码如下: 代码如下:$.ajax({ dataType: ‘jsonp’, error: function (xh

    JSONP三种方式解决跨域问题

    1、地址...演示跨域问题以及跨子域名解决方法 2、地址http://a.test.com:8888/testAjaxCross/public/jsonp.do 演示jsonp解决跨域问题的三种方案jsonp、$getJSON、$ajax等

    jquery中ajax跨域方法实例分析

    本文实例分析了jquery中...方法一: jsonp之 getJSON js var url = http://localhost/mytest/jsonp_php.php?callback=?; $.getJSON(url, { age: 21, name: kitty }, function (data) { alert(name: + data.name + ,

    Jquery跨域获得Json的简单实例

    一般跨域用到的两个方法为:$.ajax 和$.getJSON 最后,仔细安静下来,细读 json 官方文档后发现这么一段: JSON数据是一种能很方便通过JavaScript解析的结构化数据。如果获取的数据文件存放在远程服务器上(域名不同...

    AJAX跨域请求json数据的实现方法

    我们都知道,AJAX的一大限制是不允许跨域请求。... jQuery的JSONPjQuery.getJSON方法:Js代码 代码如下:jQuery.getJSON(“http://search.twitter.com/search.json?callback=?”,{ q: “Arsenal” },functio

    Ajax跨域调用 - FlyJSONP.zip

    FlyJSONP是一个JavaScript Library用于实现跨域GET和POST请求服务,支持JSONP,并取得一个JSON响应。这个Library具有易于使用,不复杂,非常小,GZIP压缩之后只有1.13kb,并且没有依赖任何JS框架。

    基于vue-resource jsonp跨域问题的解决方法

    最近在学习vue.js 碰到个ajax跨域请求的问题,之前知道...这里我以json数据为例,首先我们通过 $.get可以直接得到一个我们想要的对象,但是用 jsonp 就会出现报错代码如下, $.ajax({ url:"http://192.168.8.59/wei

    jquery下利用jsonp跨域访问实现方法

    本文将给您介绍如何使用getJSON来实现异步跨域提交表单

    跨域请求两种方法 jsonp和cors的实现

    jsonp方法 伪造ajax提交请求 请求端 // 基于jsonp // 原理: ajax 不能直接跨域 。 //向html中加入script标签 含有访问路径,script标签直接访问路径达到效果 $('.get_service2').click(function () { // ...

    使用jsonp完美解决跨域问题

    调用web接口,get请求,发现提示:No ‘Access-Control-Allow-Origin’ header is present on ...$.ajax({  url: “http://…….”,  type: ‘GET’,  dataType: ‘JSONP’,//here  success: function (data) {  

    jsonp原理及使用

    初识jsonpjsonp 全称是JSON with Padding,是为了解决跨域请求资源而产生的解决方案。很多时候我们需要在客户端获取服务器数据进行操作,一般我们会使用ajax+webservice做此事,但是如果我们希望获取的数据和当前...

    详细解密jsonp跨域请求

    当进行一些比较深入的前端编程的时候,不可避免地需要进行跨域操作,JSONP跨域GET请求是一个常用的解决方案,下面我们来看一下JSONP跨域是如何实现的,并且探讨下JSONP跨域的原理。

    利用jsonp跨域调用百度js实现搜索框智能提示

    使用jquery.ajax的jsonp方法可以异域调用到百度的js并拿到返回值,当然$.getScript也可以实现跨域调用js。  ok,了解了jsonp的原理和应用后,我们看看百度的智能提示是如何做的 在chrome的调试窗口下看看百度搜索...

    JQuery中getJSON的使用方法

    这里采用了JSONP(JSON with Padding-填充json数据也就是常用的json跨域方式):利用script标签,通过特定的src地址的调用,来执行一个客户端的js函数,在 服务器端生成相对的数据(JSON格式)并以参数的形式传递给...

    jquery的ajax和getJson跨域获取json数据的实现方法

    很多开发人员在使用jquery在前端和服务器端进行数据交互,所以很容易会认为在前端利用jquery就可以读取任何站点的数据了。近日在进行开 发时,因为要和第三方公司的一个项目进行数据的共享,因为考虑多不占用服务器...

    jquery电子文档chm

    jQuery 1.2 中,您可以跨域加载 JSON 数据,使用时需将数据类型设置为 JSONP。使用 JSONP 形式调用函数时,如 "myurl?callback=?" jQuery 将自动替换 ? 为正确的函数名,以执行回调函数。数据类型设置为 "jsonp" 时...

Global site tag (gtag.js) - Google Analytics