jsonp跨域传值

来源:互联网 发布:手机如何彻底卸载软件 编辑:程序博客网 时间:2024/05/22 17:07

1、什么是jsonp?

JSONP是一种非正式传输协议,该协议的一个要点就是允许用户传递一个callback参数给服务端,然后服务端返回数据时会将这个callback参数作为函数名来包裹住JSON数据,这样客户端就可以随意定制自己的函数来自动处理返回数据了 

2、json与jsonp的区别?
json 是一种数据格式
jsonp 是一种数据调用的方式

3、JSONP有什么用?

由于同源策略的限制,XmlHttpRequest只允许请求当前源(域名、协议、端口)的资源,为了实现跨域请求,可以通过script标签实现跨域请求,然后在服务端输出JSON数据并执行回调函数,从而解决了跨域的数据请求
使用JSON的优点在于:

比XML轻了很多,没有那么多冗余的东西。
JSON也是具有很好的可读性的,但是通常返回的都是压缩过后的。不像XML这样的浏览器可以直接显示,浏览器对于JSON的格式化的显示就需要借助一些插件了。
在JavaScript中处理JSON很简单。
其他语言例如PHP对于JSON的支持也不错。

JSON也有一些劣势:

JSON在服务端语言的支持不像XML那么广泛,不过JSON.org上提供很多语言的库。
如果你使用eval()来解析的话,会容易出现安全问题。

尽管如此,JSON的优点还是很明显的。他是Ajax数据交互的很理想的数据格式。
4、jsonp的实现原理:
首先在客户端注册一个callback, 然后把callback的名字传给服务器。
此时,服务器先生成 json 数据。
然后以 javascript 语法的方式,生成一个function , function 名字就是传递上来的参数 jsonp.
最后将 json 数据直接以入参的方式,放置到 function 中,这样就生成了一段 js 语法的文档,返回给客户端。
客户端浏览器,解析script标签,并执行返回的 javascript 文档,此时数据作为参数,传入到了客户端预先定义好的 callback 函数里.(动
态执行回调函数)
5、jsonp的实现方式:
实现方式1:就是利用<script>标签没有跨域限制的“漏洞”
很简单,(历史遗迹啊)来达到与第三方通讯的目的。当需要通讯时,本站脚本创建一个<script>元素,地址指向第三方的API网址,形
如:
<script src="http://www.example.net/api?param1=1¶m2=2"></script>
并提供一个回调函数来接收数据(函数名可约定,或通过地址参数传递)。
第三方产生的响应为json数据的包装(故称之为jsonp,即json padding),形如:
callback({"name":"hax","gender":"Male"})

这样浏览器会调用callback函数,并传递解析后json对象作为参数。本站脚本可在callback函数里处理所传入的数据。
代码实现:
下面文件内容在:www.test1.com域名下,请求www.test2.com下的test2.php文件内容
<meta content="text/html; charset=utf-8"http-equiv="Content-Type"/>
<
script type="text/javascript">
function jsonpCallback(result) {
alert(result.name);
}
</
script>
<
script type="text/javascript"src="www.test2.com/test2.php?callback=jsonpCallback"></scri
pt
>
以上代码需要注意:JavaScript的链接,必须在function的下面
下面文件内容在www.test2.com下的test2.php里:
<?php
header
(
"content-type:text/html;charset=utf-8");
@
$arr=array(
name=>"zhangsan",
age=>23,
sex=>'男'
);
echo $_GET['callback']."(".json_encode($arr).")";
?>
实现方式2:利用$.getJSON实现
下面文件内容在:www.test1.com域名下,请求www.test2.com下的test2.php文件内容
<script type="text/javascript"src="引入jquery路径"></script>
<
script type="text/javascript">
$.getJSON("http://www.test2.com/test2.php?callback=?",
function(result) {
alert(result.name)//就可以得到name的值
}
});
</
script>
下面文件内容在www.test2.com下的test2.php里:
<?php
header("content-type:text/html;charset=utf-8");
@
$arr=array(
name=>"zhangsan",
age=>23,
sex=>''
);
echo $_GET['callback']."(".json_encode($arr).")";
?>
实现方式3:利用$.ajax实现
下面文件内容在:www.test1.com域名下,请求www.test2.com下的test2.php文件内容
<script>
$.ajax({
url:'http://www.wp.com/getData.php'//跨域到http://www.wp.com,另,http://test.com
算跨域
type:'GET',//jsonp 类型下只能使用GET,不能用POST,这里不写
默认为
GET
dataType:'jsonp',//指定为jsonp类型
data:{"name":"Zjmainstay"},//数据参数
jsonp:'callback',//服务器端获取回调函数名的key,对应后台有$_GET['callback']='‘getName';ca
llback
是默值
jsonpCallback:'getName',//回调函数名
success:function(result){//成功执行处理,对应后台返回的getName(data)
法。
alert(result.name);//可以得到zhangsan
}
});
</
script>
下面文件内容在www.test2.com下的test2.php里:
<?php
header("content-type:text/html;charset=utf-8");
@
$arr=array(
name=>"zhangsan",
age=>23,
sex=>''
);
echo $_GET['callback']."(".json_encode($arr).")";
?>






0 0
原创粉丝点击