AJAX跨域请求JSONP获取JSON数据的实例代码

发布时间 - 2026-01-10 23:12:01    点击率:

Asynchronous JavaScript and XML (Ajax) 是驱动新一代 Web 站点(流行术语为 Web 2.0 站点)的关键技术。Ajax 允许在不干扰 Web 应用程序的显示和行为的情况下在后台进行数据检索。使用XMLHttpRequest 函数获取数据,它是一种 API,允许客户端 JavaScript 通过 HTTP 连接到远程服务器。Ajax 也是许多 mashup 的驱动力,它可将来自多个地方的内容集成为单一 Web 应用程序。

不过,由于受到浏览器的限制,该方法不允许跨域通信。如果尝试从不同的域请求数据,会出现安全错误。如果能控制数据驻留的远程服务器并且每个请求都前往同一域,就可以避免这些安全错误。但是,如果仅停留在自己的服务器上,Web 应用程序还有什么用处呢?如果需要从多个第三方服务器收集数据时,又该怎么办?

理解同源策略

同源策略阻止从一个域上加载的脚本获取或操作另一个域上的文档属性。也就是说,受到请求的 URL 的域必须与当前 Web 页面的域相同。这意味着浏览器隔离来自不同源的内容,以防止它们之间的操作。这个浏览器策略很旧,从 Netscape Navigator 2.0 版本开始就存在。

克服该限制的一个相对简单的方法是让 Web 页面向它源自的 Web 服务器请求数据,并且让 Web 服务器像代理一样将请求转发给真正的第三方服务器。尽管该技术获得了普遍使用,但它是不可伸缩的。另一种方式是使用框架要素在当前 Web 页面中创建新区域,并且使用GET 请求获取任何第三方资源。不过,获取资源后,框架中的内容会受到同源策略的限制。

克服该限制更理想方法是在 Web 页面中插入动态脚本元素,该页面源指向其他域中的服务 URL 并且在自身脚本中获取数据。脚本加载时它开始执行。该方法是可行的,因为同源策略不阻止动态脚本插入,并且将脚本看作是从提供 Web 页面的域上加载的。但如果该脚本尝试从另一个域上加载文档,就不会成功。幸运的是,通过添加 JavaScript Object Notation (JSON) 可以改进该技术。

1、什么是JSONP?

要了解JSONP,不得不提一下JSON,那么什么是JSON?

JSON is a subset of the object literal notation of JavaScript. Since JSON is a subset of JavaScript, it can be used in the language with no muss or fuss.

JSONP(JSON with Padding)是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问(这仅仅是JSONP简单的实现形式)。

2、JSONP有什么用?

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

3、如何使用JSONP?

下边这一DEMO实际上是JSONP的简单表现形式,在客户端声明回调函数之后,客户端通过script标签向服务器跨域请求数据,然后服务端返回相应的数据并动态执行回调函数。

HTML代码 (任一):

<meta content="text/html; charset=utf-8" http-equiv="Content-Type" /> 
<script type="text/javascript"> 
  function jsonpCallback(result) { 
    //alert(result); 
    for(var i in result) { 
      alert(i+":"+result[i]);//循环输出a:1,b:2,etc. 
    } 
  } 
  var JSONP=document.createElement("script"); 
  JSONP.type="text/javascript"; 
  JSONP.src="http://crossdomain.com/services.php?callback=jsonpCallback"; 
  document.getElementsByTagName("head")[0].appendChild(JSONP); 
</script> 

或者

Html代码

<meta content="text/html; charset=utf-8" http-equiv="Content-Type" /> 
<script type="text/javascript"> 
  function jsonpCallback(result) { 
    alert(result.a); 
    alert(result.b); 
    alert(result.c); 
    for(var i in result) { 
      alert(i+":"+result[i]);//循环输出a:1,b:2,etc. 
    } 
  } 
</script> 
<script type="text/javascript" src="http://crossdomain.com/services.php?callback=jsonpCallback"></script> 

JavaScript的链接,必须在function的下面。

服务端PHP代码 (services.php):

Php代码 

<?php 
//服务端返回JSON数据 
$arr=array('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5); 
$result=json_encode($arr); 
//echo $_GET['callback'].'("Hello,World!")'; 
//echo $_GET['callback']."($result)"; 
//动态执行回调函数 
$callback=$_GET['callback']; 
echo $callback."($result)"; 

 如果将上述JS客户端代码用jQuery的方法来实现,也非常简单。

$.getJSON
$.ajax
$.get

客户端JS代码在jQuery中的实现方式1:

Js代码 

<script type="text/javascript" src="jquery.js"></script> 
<script type="text/javascript"> 
  $.getJSON("http://crossdomain.com/services.php?callback=?", 
  function(result) { 
    for(var i in result) { 
      alert(i+":"+result[i]);//循环输出a:1,b:2,etc. 
    } 
  }); 
</script>  

客户端JS代码在jQuery中的实现方式2:

Js代码 

<script type="text/javascript" src="jquery.js"></script> 
<script type="text/javascript"> 
  $.ajax({ 
    url:"http://crossdomain.com/services.php", 
    dataType:'jsonp', 
    data:'', 
    jsonp:'callback', 
    success:function(result) { 
      for(var i in result) { 
        alert(i+":"+result[i]);//循环输出a:1,b:2,etc. 
      } 
    }, 
    timeout:3000 
  }); 
</script> 

客户端JS代码在jQuery中的实现方式3:

<script type="text/javascript" src="jquery.js"></script> 
<script type="text/javascript"> 
    $.get('http://crossdomain.com/services.php?callback=?', {name: encodeURIComponent('tester')}, function (json) { for(var i in json) alert(i+":"+json[i]); }, 'jsonp'); 
</script> 
 
其中 jsonCallback 是客户端注册的,获取跨域服务器上的json数据后,回调的函数。

http://crossdomain.com/services.php?callback=jsonpCallback

这个 url 是跨域服务器取 json 数据的接口,参数为回调函数的名字,返回的格式为

jsonpCallback({msg:'this is json data'})  

Jsonp原理:

首先在客户端注册一个callback, 然后把callback的名字传给服务器。

此时,服务器先生成 json 数据。
然后以 javascript 语法的方式,生成一个function , function 名字就是传递上来的参数 jsonp.

最后将 json 数据直接以入参的方式,放置到 function 中,这样就生成了一段 js 语法的文档,返回给客户端。

客户端浏览器,解析script标签,并执行返回的 javascript 文档,此时数据作为参数,传入到了客户端预先定义好的 callback 函数里.(动态执行回调函数)

使用JSON的优点在于:

比XML轻了很多,没有那么多冗余的东西。

JSON也是具有很好的可读性的,但是通常返回的都是压缩过后的。不像XML这样的浏览器可以直接显示,浏览器对于JSON的格式化的显示就需要借助一些插件了。

在JavaScript中处理JSON很简单。

其他语言例如PHP对于JSON的支持也不错。

JSON也有一些劣势:

JSON在服务端语言的支持不像XML那么广泛,不过JSON.org上提供很多语言的库。

如果你使用eval()来解析的话,会容易出现安全问题。

尽管如此,JSON的优点还是很明显的。他是Ajax数据交互的很理想的方式。

主要提示:

JSONP 是构建 mashup 的强大技术,但不幸的是,它并不是所有跨域通信需求的万灵药。它有一些缺陷,在提交开发资源之前必须认真考虑它们。

第一,也是最重要的一点,没有关于 JSONP 调用的错误处理。如果动态脚本插入有效,就执行调用;如果无效,就静默失败。失败是没有任何提示的。例如,不能从服务器捕捉到 404 错误,也不能取消或重新开始请求。不过,等待一段时间还没有响应的话,就不用理它了。(未来的 jQuery 版本可能有终止 JSONP 请求的特性)。

JSONP 的另一个主要缺陷是被不信任的服务使用时会很危险。因为 JSONP 服务返回打包在函数调用中的 JSON 响应,而函数调用是由浏览器执行的,这使宿主 Web 应用程序更容易受到各类攻击。如果打算使用 JSONP 服务,了解它能造成的威胁非常重要。

以上所述是小编给大家介绍的AJAX跨域请求JSONP获取JSON数据的实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


# ajax跨域请求json  # ajax  # json  # 跨域请求  # 原生js实现ajax请求和JSONP跨域请求操作示例  # 详解Java Ajax jsonp 跨域请求  # 通过jsonp获取json数据实现AJAX跨域请求  # Ajax jsonp跨域请求实现方法  # AJAX跨域请求之JSONP获取JSON数据  # AJAX跨域请求json数据的实现方法  # 跨域请求之jQuery的ajax jsonp的使用解惑  # AJAX跨域请求获取JSON数据的实现方法  # 客户端  # 回调  # 服务端  # 应用程序  # 的是  # 第三方  # 加载  # 文档  # 多个  # 它是  # 不像  # 小编  # 自己的  # 都是  # 是一个  # 器上  # 这一  # 如果你  # 是在  # 还没有 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)  Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  Linux网络带宽限制_tc配置实践解析【教程】  微信h5制作网站有哪些,免费微信H5页面制作工具?  Laravel如何实现一对一模型关联?(Eloquent示例)  Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧  Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】  Laravel Octane如何提升性能_使用Laravel Octane加速你的应用  HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】  🚀拖拽式CMS建站能否实现高效与个性化并存?  Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门  Laravel怎么使用artisan命令缓存配置和视图  进行网站优化必须要坚持的四大原则  如何确保西部建站助手FTP传输的安全性?  Laravel模型事件有哪些_Laravel Model Event生命周期详解  Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践  Laravel如何使用查询构建器?(Query Builder高级用法)  Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】  Android自定义listview布局实现上拉加载下拉刷新功能  学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?  如何在万网主机上快速搭建网站?  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  济南网站建设制作公司,室内设计网站一般都有哪些功能?  Python3.6正式版新特性预览  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  如何在IIS中新建站点并解决端口绑定冲突?  谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程  laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法  千库网官网入口推荐 千库网设计创意平台入口  Laravel如何实现多对多模型关联?(Eloquent教程)  javascript读取文本节点方法小结  齐河建站公司:营销型网站建设与SEO优化双核驱动策略  如何获取PHP WAP自助建站系统源码?  太平洋网站制作公司,网络用语太平洋是什么意思?  百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭  Claude怎样写结构化提示词_Claude结构化提示词写法【教程】  phpredis提高消息队列的实时性方法(推荐)  中国移动官方网站首页入口 中国移动官网网页登录  深圳网站制作平台,深圳市做网站好的公司有哪些?  jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】  Laravel如何使用Service Container和依赖注入?(代码示例)  Python正则表达式进阶教程_复杂匹配与分组替换解析  在Oracle关闭情况下如何修改spfile的参数  如何在腾讯云服务器快速搭建个人网站?  laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法  详解jQuery中基本的动画方法  MySQL查询结果复制到新表的方法(更新、插入)  高端企业智能建站程序:SEO优化与响应式模板定制开发