`

jsonp实现跨域ajax调用

    博客分类:
  • json
阅读更多

     Ajax在前台的开发中使用越来越多,为前台用户体验带来了很大的提升。但是由于XMLHttpRequest的安全限制,普通的Ajax请求不能实现跨域访问,这主要是由于浏览器的浏览器的同源策略限制导致的。可是在有些场景下,我们非常希望通过Ajax的方式获取远程的数据,这样就不需要再通过后台进行数据的获取,会极大的减小开发量。

       实现前台跨域访问,我们可以通过frame或者script标签的src来实现,这种方式可以进行远程数据的获取,但是这两种方式需要我们自己去监听不同的事件,处理起来比较复杂,程序员的好习惯就是lazy了,我们会寻找更加简单的解决方案。一种解决方案就是本文将要介绍的JSONP。

 

JSONP和JSON

 

      JSONP维基百科的解释JSONPJSON with Padding是资料格式 JSON 的一种“使用模式”,可以让网页从别的网域要资料。另一个解决这个问题的新方法是跨来源资源共享

   由于同源策略,一般来说位于 server1.example.com 的网页无法与不是 server1.example.com 的服务器沟通,而HTML 的 <script> 元素是一个例外。利用 <script> 元素的这个开放策略,网页可以得到从其他来源动态产生的 JSON 资料,而这种使用模式就是所谓的 JSONP。用 JSONP 抓到的资料并不是 JSON,而是任意的 JavaScript,用 JavaScript 直译器执行而不是用 JSON 解析器解析。

   JSONP是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问。在知道JSONP是什么之后,我们要来看下怎么用JSONP。其实很多优秀的js库都已经实现了JSONP,而且很好的屏蔽了其技术细节,使用是就和普通的Ajax调用没有区别。我们来看下JQuery的实现方式和使用方式。

   简单原理:

   客户端: 

<script type="text/javascript"> 
function test(data) { 
alert(data); 
} 
</script> 
<script type="text/javascript" src="http://******.aspx?callback=test"></script> 

服务端: 
var fun = Request["callback"]; 
Response.Write(fun+"(\"你好世界\")"); 
 

   JQuery的JSONP使用

     先看一个简单的例子

      <script>

	$(
		function(){
			$.getJSON(
				"http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&tagmode=any&format=json&jsoncallback=?",
				function(data){
					$.each(data.items,function(i,item){
						$("<span></span>").text(i + '    '+ item.title).appendTo("#images");
						$("#images").append("<br>");
					});
				}
			);
		}
	);
  </script>

 

 

  上面这段代码和使用普通的Ajax调用没有太多的区别,唯一的区别就是请求的url是一个远程地址,而且在url里添加了一个jsoncallback=?这样一个参数,这个就是JSONP的关键所在了。JQuery会自动根据一个正则表达式去判断有没有XXX=?的这样一个参数,然后会在请求发出前自动把?替换成一个随机生成的函数名称(如果没有在ajaxSetting里设置的话),例如我们现在随机生成的函数名称为jQuery1010_100的函数名称,这是我们看下后台返回的格式:

 

jQuery1010_100l({
		"title": "Recent Uploads tagged cat",
		"link": "http://www.flickr.com/photos/tags/cat/",
		"description": "",
		"modified": "2012-10-15T15:20:44Z",
		"generator": "http://www.flickr.com/",
		"items": [
	   {
			"title": "_MG_5430",
			"link": "http://www.flickr.com/photos/25642376@N07/8090499253/",
			"media": {"m":"http://farm9.staticflickr.com/8046/8090499253_e12dc0c2b1_m.jpg"},
			"date_taken": "2012-10-12T19:59:37-08:00",
			"description": " <p><a href=\"http://www.flickr.com/people/25642376@N07/\">dmzkrsk<\/a> posted a photo:<\/p> <p><a href=\"http://www.flickr.com/photos/25642376@N07/8090499253/\" title=\"_MG_5430\"><img src=\"http://farm9.staticflickr.com/8046/8090499253_e12dc0c2b1_m.jpg\" width=\"240\" height=\"160\" alt=\"_MG_5430\" /><\/a><\/p> ",
			"published": "2012-10-15T15:20:44Z",
			"author": "nobody@flickr.com (dmzkrsk)",
			"author_id": "25642376@N07",
			"tags": "cat jupiter9 кузя"
	   },
	   {
			"title": "_MG_5432",
			"link": "http://www.flickr.com/photos/25642376@N07/8090507680/",
			"media": {"m":"http://farm9.staticflickr.com/8468/8090507680_162cc352f6_m.jpg"},
			"date_taken": "2012-10-12T20:00:59-08:00",
			"description": " <p><a href=\"http://www.flickr.com/people/25642376@N07/\">dmzkrsk<\/a> posted a photo:<\/p> <p><a href=\"http://www.flickr.com/photos/25642376@N07/8090507680/\" title=\"_MG_5432\"><img src=\"http://farm9.staticflickr.com/8468/8090507680_162cc352f6_m.jpg\" width=\"240\" height=\"160\" alt=\"_MG_5432\" /><\/a><\/p> ",
			"published": "2012-10-15T15:21:56Z",
			"author": "nobody@flickr.com (dmzkrsk)",
			"author_id": "25642376@N07",
			"tags": "dog cat catdog jupiter9 кузя чаппа"
	   }]});

  从返回值可以看到,后台应该返回一个合法的js函数调用,而函数名称就是JQuery自动生成的那个。那么这个函数时在哪儿生成的呢,和我们在getJSON里定义的callback是什么关系呢,JQuery实现的魔法在哪儿呢?

 在jquery的源码里,我们看到这样一段

  // Install callback

		window[ jsonpCallback ] = function( response ) {
			responseContainer = [ response ];
		};

		// Clean-up function
		jqXHR.always(function() {
			// Set callback back to previous value
			window[ jsonpCallback ] = previous;
			// Call if it was a function and we have a response
			if ( responseContainer && jQuery.isFunction( previous ) ) {
				window[ jsonpCallback ]( responseContainer[ 0 ] );
			}
		});
最终效果
0 Pink_aRT__UFONET_2012
1 yoga!
2 I love this pic
3 P1020870
4 P1020871
5 Monday morning
6 Sexy_Kızıl_77___UFONET_2012
7 hide and seek
8 
9 Dexter
10 Nightlife
11 
12 Dior & Daeron
13 Dior & Daeron
14 Dior & Daeron
15 Black cats for Halloween
16 Dior & Daeron
17 Dior & Daeron
18 kitten 2
 
分享到:
评论

相关推荐

    jsonp json ajax跨域调用

    - **JSON**可以直接被JavaScript解析,而**JSONP**实际上是一个JavaScript函数调用。 - **JSON**主要用于同域内的数据交互,而**JSONP**专门用于跨域场景。 - **JSON**的响应是纯数据,而**JSONP**的响应是可执行的...

    html通过 ajax jsonp跨域请求接收和传送数据

    **AJAX和JSONP跨域请求的实现过程** 1. **AJAX跨域**: 通常,AJAX请求受到同源策略限制。为实现跨域,我们可以使用CORS(Cross-Origin Resource Sharing)机制。服务器需要在响应头中添加`Access-Control-Allow-...

    JSONP实现Ajax跨域访问

    ### JSONP实现Ajax跨域访问 #### 一、引言 JSONP(JSON with Padding)是一种用于解决跨域数据访问的技术。由于同源策略(Same-Origin Policy)的存在,JavaScript/Ajax只能请求同源的资源,这给需要跨域访问数据...

    Jquery跨域Ajax请求测试

    本示例"Jquery跨域Ajax请求测试"将详细讲解如何利用jQuery实现这一功能。 首先,了解同源策略是理解跨域问题的关键。同源策略是浏览器为了保障用户安全而设定的一项机制,它规定了只有来自同一协议、同一域名和同一...

    jsonpajax跨域请求

    "jsonp跨域请求"可能是服务器返回的示例数据,模拟了JSONP的跨域请求过程。 总结,JSONP和CORS是解决JavaScript跨域问题的两种主要方法,它们各有优缺点,适用于不同的场景。JSONP简单易用,但安全性较低;CORS则更...

    jsonp解决跨域.docx

    JsonP 的核心原理是:JavaScript 使用 Ajax 无法跨域调用数据(如 XML、JSON 等),但是可以跨域调用 JavaScript 数据。JsonP 的工作原理是通过动态添加一个 script 标签,src 属性指向请求的 URL,返回的数据是一个...

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

    在JavaScript的世界里,由于同源策略的限制,浏览器禁止了不同源之间进行AJAX通信,但JSONP(JSON with Padding)作为一种巧妙的方式,允许我们绕过这个限制,实现在jQuery中进行跨域请求。本篇文章将深入探讨JSONP...

    使用Jsonp方式跨域获取json

    JSONP(JSON with Padding)是一种跨域数据交互协议,它利用了`&lt;script&gt;`标签可以跨域请求资源的特性来实现数据的交换。在Web开发中,由于浏览器的同源策略限制,JavaScript通常无法直接访问不同源的资源,但JSONP...

    JSONP解决跨域问题

    总结来说,JSONP是一种解决跨域问题的技术,通过将数据封装在JavaScript函数调用中,使得前端能够跨越同源策略的限制获取到服务端的数据。在C# Web Service中实现JSONP,需要创建支持回调的Web方法并设置适当的响应...

    ajax jsonp 跨域处理

    Ajax JSONP跨域处理是Web开发中的重要技术,通过JSONP,开发者可以在不违反同源策略的前提下实现跨域数据交互。虽然JSONP存在一些限制和安全隐患,但在许多场景下,它仍然是一个实用且有效的解决方案。随着技术的...

    原生ajax库实现jsonp跨域短小精悍

    接下来,我们来看如何编写一个简单的原生JavaScript AJAX库,支持JSONP跨域。以下是一个基本的实现框架: ```javascript function Ajax(options) { var script = document.createElement('script'); var ...

    jsonp和跨域1

    1.3.3 jQuery-JSONP跨域 jQuery提供了JSONP的支持,通过$.ajax方法的dataType参数设置为"jsonp",可以轻松发起JSONP请求。jQuery会自动生成一个唯一的回调函数名,并将其作为参数传递给服务器,服务器返回的数据应以...

    jquery跨域调用 js跨域调用

    jQuery跨域调用主要是通过JSONP(JSON with Padding)和CORS(Cross-Origin Resource Sharing)这两种机制来实现的。JSONP是一种非官方的跨域数据交互协议,而CORS是W3C标准,允许服务器声明哪些来源可以访问其资源...

    jsonp实现跨域

    JSONP(JSON with Padding)是一种跨域数据交互协议,它利用了HTML的`&lt;script&gt;`标签可以跨域请求资源的特点,来实现JavaScript从一个域获取另一个域的数据。在Web开发中,由于同源策略的限制,JavaScript通常不能...

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

    使用jQuery提供的接口,开发者可以很容易地实现JSONP跨域请求,具体方法包括$.ajax()、$.getJSON()和$.getScript()等。在实际使用过程中,需要注意回调函数名的正确传递和处理,以及确保服务器端正确响应JSONP请求。...

    jsonp解决跨域_js_方案_web_跨域_

    标题中的“jsonp解决跨域”指的是JavaScript对象标记协议(JSON with Padding,简称jsonp)这一跨域数据交互协议,它是Web应用程序中广泛使用的一种解决同源策略限制的技术。同源策略是浏览器为了安全而实施的一项...

    跨域访问解决方法-jsonp

    跨域访问是Web开发中一个常见的挑战,尤其是在进行Ajax异步请求时,浏览器的同源策略(Same-origin policy)会限制JavaScript从一个源获取另一个源的数据。为了解决这个问题,开发者通常采用JSONP(JSON with ...

    ajax jsonp跨域传参

    ajax jsonp跨域传参,里面有源码,不过写在txt中了,很适合调用别人的接口

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

    标题提到的"利用jsonp跨域调用百度js实现搜索框智能提示",即利用JSONP技术调用百度提供的API,实现在搜索框中输入关键字时,显示智能提示的功能,类似于百度搜索引擎的自动补全。 **JSONP原理**: JSONP的工作机制...

    ajax跨域调用wcf实例

    它可以支持多种协议,包括HTTP,使服务可以被AJAX调用。在WCF中实现跨域调用,我们需要配置服务以允许来自不同源的请求。 以下是实现AJAX跨域调用WCF服务的具体步骤和相关知识点: 1. **开启WCF服务的跨域支持**:...

Global site tag (gtag.js) - Google Analytics