json和json跨域
来源:互联网 发布:2017淘宝买家秀福利 编辑:程序博客网 时间:2024/06/10 01:31
先编写json.php:
<?php
echo json_encode(array(’foo’ => ‘bar’));
?>
再编写json.htm:
<script src=”http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js“></script>
<script>
$.getJSON(’/json.php’, function(data){
alert(data.foo);
});
</script>
把两个文件放到根目录下,运行http://localhost/json.htm,就能看到效果了。
上面的例子没有什么难度,下面尝试一下在跨域情况下的效果,
编写C:/WINDOWS/system32/drivers/etc/hosts文件,加入如下映射:
127.0.0.1 www.foobar.com
修改json.htm的内容:
<script src=”http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js“></script>
<script>
$.getJSON(’http://www.foobar.com/json.php’, function(data){
alert(data.foo);
});
</script>
此时,重启浏览器后再浏览http://localhost/json.htm,程序不会运行,会出现Permission denied错误。
这是因为由于同源策略的限制,XmlHttpRequest只允许请求当前源(域名、协议、端口)的资源。
如果想规避跨域问题,可以通过使用html的script标记来进行跨域请求,并在响应中返回要执行的script代码。此技术的一种实际应用方式被称为JSONP,Remote JSON - JSONP一文对其原理做了介绍。
先修改json.htm的内容:
<script src=”http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js“></script>
<script>
$.getJSON(’http://www.foobar.com/json.php?callback=?‘, function(data){
alert(data.foo);
});
</script>
再修改json.php的内容:
<?php
echo $_GET['callback'], ‘(’, json_encode(array(’foo’ => ‘bar’)), ‘)’;
?>
此时,如果再浏览json.htm,就会发现即便是跨域,程序也能正常运行。
有了callback=?后,JQuery就会知道你要进行一次JSONP请求,它会自动生成一个回调函数的名字,然后替换callback=?中的问号。callback并不是必须的命名规则,而只是客户端和服务端之间的一种约定,比如说在FlickrAPI里,使用的就不是callback,而是jsoncallback。不管使用什么命名,最后不过是生成一种function_name(json_data)的调用形式而已。
- json和json跨域
- JSON 和 JSON数组
- JSON和JSONP 跨域
- JSON JSONArray 创建JSON 和 解析JSON
- JSon对象、JSon数组和JSon字符串。
- JSON JSONArray 创建JSON 和 解析JSON
- JSON.parse()和JSON.stringify()
- JSON.parse 和 JSON.stringify
- JSON.parse()和JSON.stringify()
- JSON.parse()和JSON.stringify()
- JSON.parse()和JSON.stringify()
- JSON.parse和JSON.stringify
- 创建JSON和解析JSON
- JSON.parse()和JSON.stringify()
- JSON.parse 和 JSON.stringify
- JSON.parse()和JSON.stringify()
- 解析Json和封装Json
- JSON.parse()和JSON.stringify() .
- 删除顽固文件和程序的方法
- ArcGIS 10研究(一) 之 Desktop总体介绍
- java 设计模式之Prototype
- AMI legacy BIOS里添加2个VBIOS的问题
- strace
- json和json跨域
- (zt)MTK编译过程
- 对“银行业务调度系统模拟实现”的一点改进
- webService实例
- Scaling Your Java EE Applications
- shtml不能运行解决方案
- Linux 文件命令速成教程
- 函数体中的指针或引用常量不能被返回
- 通信工程专业考证