`
yfdong21
  • 浏览: 61877 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

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

阅读更多
http://www.cnblogs.com/fire-phoenix/archive/2009/11/13/1614144.html
简介符合Web2.0特征的众多网站一个明显的特点就是采用Ajax。Ajax提供了在后台提交请求访问数据的功能。其实现主要使用的是 XMLHttpRequest函数,这个函数允许客户端的Javascript 发送到服务器端的HTTP请求并获得返回数据。Ajax同时也是目前众多的Mashup背后

简介
符合Web2.0特征的众多网站一个明显的特点就是采用Ajax。Ajax提供了在后台提交请求访问数据的功能。其实现主要使用的是XMLHttpRequest函数,这个函数允许客户端的Javascript
发送到服务器端的HTTP请求并获得返回数据。Ajax同时也是目前众多的Mashup背后的驱动力量,他们都利用Ajax来聚合不同来源的信息。

理解同源策略的限制
同源策略是指阻止代码获得或者更改从另一个域名下获得的文件或者信息。也就是说我们的请求地址必须和当前网站的地指相同。同源策略通过隔离来实现对资源的保护。这个策略的历史非常悠久
从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服务
    既然我们已经知道如何使用JSONP,那么我们也就可以使用一些现有的JSONP服务了,下面是一些例子:
    Digg API:http://services.digg.com/stories/top?appkey=http%3A%2F%2Fmashup.com&type=javas

cript&callback=?
    Geonames API:http://www.geonames.org/postalCodeLookupJSON?postalcode=10504&country=US&callback=?
    Flickr API:http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&tagmode=any&format=json&jsoncallback=?
                   
注意:
    JSONP是一个非常强大的构建mashp的方法,可是不是一个解决跨域访问问题的万能药。它也有一些缺点
    第一也是最重要的:JSONP不提供错误处理。如果动态插入的代码正常运行,你可以得到返回,但是如果失败了,那么什么都不会发生。你无法获得一个404的错误,也不能取消这个请求
    另外一个重要的缺点是如果使用了不信任的服务会造成很大的安全隐患。

分享到:
评论

相关推荐

    解决JQurey跨域问题$.get|$.post|$.getJSON等等统统可跨域

    本篇将详细介绍如何解决jQuery跨域问题,涉及的方法包括$.get、$.post和$.getJSON等。 首先,我们需要理解什么是跨域。同源策略是浏览器为保障安全而实施的一项机制,它规定JavaScript只能访问与当前页面同源(协议...

    jQuery的3种请求方式$.post,$.get,$.getJSON

    在jQuery库中,$.post, $.get和$.getJSON是用于执行AJAX(Asynchronous JavaScript and XML)请求的三种主要方法,这些方法使得前端与后端服务器进行异步数据交互成为可能,无需刷新整个页面。接下来,我们将详细...

    用原生JavaScript实现jQuery的$.getJSON的解决方法

    文章提供了使用原生JavaScript来实现jQuery中的$.getJSON功能的方法,通过创建script标签并通过JSONP技术来绕过同源策略。这种方法可以减少不必要的库依赖,对于那些需要处理少量AJAX请求的简单Web应用尤其有用。...

    jquery 异步调用$.ajax() $.post() $.get()

    本篇文章将深入探讨jQuery中的异步调用方法,包括`$.ajax()`,`$.post()`和`$.get()`,以及它们在实际开发中的应用。 首先,`$.ajax()`是jQuery提供的最强大的异步数据请求函数,它支持多种HTTP请求方法,如GET、...

    Ajax跨域查询完美解决通过$.getJSON()实现

    在使用$.getJSON()进行跨域请求时,虽然这是一种快速实现跨域的方法,但开发者需要考虑数据安全性和服务端支持等因素。对于敏感或大量数据,建议采取更安全的跨域策略,如服务器端设置CORS响应头策略,或者采用代理...

    通过jquery的$.getJSON做一个跨域ajax请求试验

    在本文中,我们将探讨如何使用jQuery的`$.getJSON`方法进行跨域Ajax请求,并通过一个简单的预约登记接口的示例来展示其实现过程。首先,理解`$.getJSON`是jQuery库提供的一个便捷方法,用于异步获取JSON格式的数据,...

    使用$.getJSON实现跨域ajax请求示例代码

    例如,以下是一个简单的使用 $.getJSON 进行跨域请求的例子: 服务器端(如 PHP): ```php // 假设这是服务器返回的 PHP 文件,返回 JSON 数据 $arr = array("name" =&gt; "zhangsan", "age" =&gt; 20); $jarr = json_...

    JQuery用$.ajax或$.getJSON跨域获取JSON数据的实现代码

    除了$.getJSON,我们也可以使用$.ajax方法来实现跨域JSONP请求。示例代码如下: ```javascript $(function() { $.ajax({ type: 'GET', url: 'http://localhost:8000/user.php?jsoncallback=?', dataType: '...

    jquery $.getJSON()跨域请求

    `$.getJSON()` 方法在处理跨域请求时,实际上就是一种对 JSONP 技术的封装和简化。`$.getJSON()` 会在请求的 URL 中加入一个 `callback` 参数,这样服务器返回的数据就会被包装在一个函数调用中,这个函数由 `...

    jQuery中$.ajax()和$.getJson()同步处理详解

    另一个jQuery方法$.getJson()是$.ajax()方法的简化版本,专用于处理JSON格式的数据。在某些特定场景下,开发者可能需要进行同步请求处理,即在一个请求完成之前,其他的JavaScript代码将停止执行,这与异步请求相反...

    跨域jsonp资料包.zip

    在这个"跨域jsonp资料包.zip"中,我们可以深入探讨JSONP的工作原理、应用场景、优缺点以及相关的实现方法。 ### JSONP 的工作原理 1. **同源策略**:浏览器的同源策略限制了JavaScript只能访问与当前页面同源...

    $.ajax()方法详解

    此外,还有一些其他的选项,如`contentType`(请求的Content-Type头)、`crossDomain`(是否跨域请求)、`xhrFields`(自定义XMLHttpRequest实例字段)等,它们进一步增强了$.ajax()方法的灵活性。 使用$.ajax()...

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

    jQuery提供了`.ajax()`和`.getJSON()`两个方法来实现JSONP。下面将详细解释这两个方法以及JSONP的工作原理。 1. **jQuery的`.ajax()`方法:** 在提供的代码示例中,`$.ajax()`方法用于发起一个跨域GET请求。设置`...

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

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

    Jquery getJson

    在本文中,我们将深入探讨`jQuery.getJSON`的工作原理、使用方法以及如何结合PHP进行数据交换。 ### 1. `jQuery.getJSON` 概述 `jQuery.getJSON`是jQuery AJAX方法的一种,专门用于从指定URL获取JSON格式的数据。...

    JQ中$.ajax()方法详解

    下面我们将详细解析`$.ajax()`方法中的各个参数及其使用场景。 #### 1. `url` - 类型:String - 默认值:当前页面地址 - 描述:指定请求的URL地址。这是发送请求的基本信息之一,必须正确填写目标服务器端点。 ##...

    jQuery 封装Ajax

    jQuery的Ajax方法主要包括`$.ajax()`, `$.get()`, `$.post()`, `$.getJSON()`等。这些方法都提供了一种优雅的方式来发送和接收数据,同时提供了丰富的配置选项来处理各种情况。 ### 1. `$.ajax()` `$.ajax()`是...

Global site tag (gtag.js) - Google Analytics