糖尿病康复,内容丰富有趣,生活中的好帮手!
糖尿病康复 > AJAX跨域请求JSONP获取JSON数据步骤详解(code)

AJAX跨域请求JSONP获取JSON数据步骤详解(code)

时间:2022-01-11 09:34:27

相关推荐

AJAX跨域请求JSONP获取JSON数据步骤详解(code)

web前端|js教程

javascript,JSONP,JSON

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

asp 直销 源码,vscode html实时,怎么启动安装完成的ubuntu,软件测试tomcat,sqlite3卸载,js 手机签到日历插件,前端技术框架与工程外包,爬虫设计及实现流程,linux php部署,揭阳技术seo,剧情吧网站源码,网页注册界面模板下载,flash网站源码模板lzw

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

卡盟源码破解版,vscode文档对比,特斯拉 ubuntu,tomcat返回201,sqlite事件通知,一个服务器可以建几个网站,带左右箭头轮播插件,前端框架学多久,爬虫宠,自强学堂php,seo网站优化视频教程,网站psd下载,微信游戏圈发网页链接,软件源代码文档模板,一个页面中js显示更多,舆情管理系统 开源,屏保程序代码lzw

理解同源策略

汽车设计源码,vscode标签自动补全,ubuntu终端subl,tomcat总是安装失败,sqlite编辑器在哪里,蹲便器往上爬虫子原因,php框架中,海南长沙seo优化企业,手机网站免费制作平台,设置wifi登录页面模板lzw

同源策略阻止从一个域上加载的脚本获取或操作另一个域上的文档属性。也就是说,受到请求的 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代码 (任一):

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="/services.php?callback=jsonpCallback"; document.getElementsByTagName("head")[0].appendChild(JSONP);

或者

Html代码

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.} }

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

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

Php代码

1,=>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代码

$.getJSON("/services.php?callback=?", function(result) {for(var i in result) { alert(i+":"+result[i]);//循环输出a:1,b:2,etc.} });

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

Js代码

$.ajax({url:"/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 });

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

$.get(‘/services.php?callback=?’, {name: encodeURIComponent(‘tester’)}, function (json) { for(var i in json) alert(i+”:”+json[i]); }, ‘jsonp’);

其中 jsonCallback 是客户端注册的,获取跨域服务器上的json数据后,回调的函数。

/services.php?callback=jsonpCallback

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

jsonpCallback({msg: his 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那么广泛,不过上提供很多语言的库。

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

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

主要提示:

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

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

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

如果觉得《AJAX跨域请求JSONP获取JSON数据步骤详解(code)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。