AngularJS中的JSONP实例解析


Posted in Javascript onDecember 01, 2016

概念

      首先呢,Json和JSONP是不一样的哦。Json呢,是众多数据存储的其中一种格式,是数据书写方式的其中一种。好比是大中华众多诗体的一种(比如说是七言诗吧)。这种诗体规定了: 这种诗体要包含题目,每行诗句的字数(7个字) 等等的文本格式。而Json所规定的文本格式是这样子的

AngularJS中的JSONP实例解析

(Json格式示意图)

   而JSONP呢,它是一种特殊的通讯方式,使用它能够轻松绕过浏览器的同源安全限制,达到加载来自不同源的资源(脚本, 图片, 其他)的效果。比如说,您是一个王国的王子,你意外地喜欢上了附近一个小城镇里面的一位漂亮年轻的姑娘(资源),你想和她见面并进一步往下发展(获取资源)。但是呢,您的父亲国王先生(浏览器)可不同意,国王认为这个姑娘不是王室的女孩(非同源的资源),配不上王子,把王子困在城堡里面的同时,还往城堡外放好多士兵监察,禁止外人进入(浏览器的同源安全限制)。但是王子对爱非常坚持,他试过多种方式与这个姑娘联系,比如说让太监欧巴带封信给漂亮姑娘(PUT,GET,POST等等),但是呢,每当到达城门的时候,士兵就会发现这封信的地址是给小姑娘的,于是屡屡禁止了太监出去(获取外部资源时,PUT,GET,POST不奏效)。于是王子想到了一种特殊的通讯方式,就是飞鸽传书(JSONP),小鸽子呢能够飞跃城堡,从而避开士兵的监察(绕过浏览器的同源安全限制),来达到与姑娘通讯的效果(与跨域资源共享CORS的通讯实现啦!O(∩_∩)O)。最终,经过九九八十一难之后,王子喜欢上了太监(∑(っ °Д °;)っ 人生处处充满惊喜...)

具体的实现方法

    要达到这种通讯效果,王子(发送请求的方式)和姑娘(服务端)都要有所准备。

 王子在发送JSONP请求的时候,首先需要一只鸽子吧(使用Jsonp), 再来呢,需要一封信绑在鸽子上(地址栏中的callback参数)

$http.jsonp("https://api.github.com?callback=CALLBACK").success(function(data){//...})

当姑娘接到小鸽子带来的信之后呢,也要把内容写在小鸽子身上的信,来回信(通过callback参数,把响应内容包装成一个JavaScript参数,并由该请求对应的回调函数来进行调用)

包装数据的方法

res.send(【callback函数】+ '('+ JSON.stringify(result) + ')');

 其他细节

    使用JSONP的时候,AngularJS会生成一个 <script> 标签并插入到DOM中进行请求,响应成功之后会把该节点删除(删除节点这点具体Angular版本不同可能会有所不同吧)

其中,CALLBACK会被替换成一个特地为此请求生成的自定义函数,即是由

$http.jsonp("https://api.github.com?callback=CALLBACK")...) 变成

<script src="https://api.github.com?callback=angular.callback._0"></script>

   因此当我们自己开发JSONP的后端服务时,要确保响应数据被包含在请求指定的回调函数中

  注意事项

   使用JSOPN有潜在的安全隐患,因为JSONP允许后端服务调用应用的JavaScript,使站点变得脆弱的同时,还可能暴露用户隐私

  文章参考

以上就是本文的全部内容,希望对大家有所帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
js option删除代码集合
Nov 12 Javascript
Javascript高级技巧分享
Feb 25 Javascript
JS使用parseInt解析数字实现求和的方法
Aug 05 Javascript
js中 javascript:void(0) 用法详解
Aug 11 Javascript
JS实现的tab切换选项卡效果示例
Feb 28 Javascript
纯js实现的积木(div层)拖动功能示例
Jul 19 Javascript
温故知新——JavaScript中的字符串连接问题最全总结(推荐)
Aug 21 Javascript
p5.js入门教程和基本形状绘制
Mar 15 Javascript
通过jquery toggleClass()属性制作文章段落更改背景颜色
May 21 jQuery
微信小程序五子棋游戏的棋盘,重置,对弈实现方法【附demo源码下载】
Feb 20 Javascript
vue全局自定义指令-元素拖拽的实现代码
Apr 14 Javascript
node.JS二进制操作模块buffer对象使用方法详解
Feb 06 Javascript
JavaScript交换两个变量值的七种解决方案
Dec 01 #Javascript
bootstrap学习使用(导航条、下拉菜单、轮播、栅格布局等)
Dec 01 #Javascript
实例解析jQuery工具函数
Dec 01 #Javascript
Vue.js实现简单ToDoList 前期准备(一)
Dec 01 #Javascript
获取jqGrid中选择的行的数据
Nov 30 #Javascript
基于Vue.js实现简单搜索框
Mar 26 #Javascript
深入理解jQuery.data() 的实现方式
Nov 30 #Javascript
You might like
phpMyAdmin出现无法载入 mcrypt 扩展,请检查PHP配置的解决方法
2012/03/26 PHP
php调用c接口无错版介绍
2014/03/11 PHP
php强制文件下载而非在浏览器打开的自定义函数分享
2014/05/08 PHP
两千行代码的PHP学习笔记汇总
2014/10/05 PHP
分享一段PHP制作的中文拼音首字母工具类
2014/12/11 PHP
WordPres对前端页面调试时的两个PHP函数使用小技巧
2015/12/22 PHP
PHP中类属性与类静态变量的访问方法示例
2016/07/13 PHP
laravel 解决强制跳转 https的问题
2019/10/22 PHP
优化JavaScript脚本的性能的几个注意事项
2006/12/22 Javascript
我见过最全的个人js加解密功能页面
2007/12/12 Javascript
javascript 禁止复制网页
2009/06/11 Javascript
Microsoft Ajax Minifier 压缩javascript的方法
2010/03/05 Javascript
jQuery 学习入门篇附实例代码
2010/03/16 Javascript
Jquery ajaxStart()与ajaxStop()方法(实例讲解)
2013/12/18 Javascript
JavaScript中输出标签的方法
2014/08/27 Javascript
javascript实现的网站访问量统计代码
2015/12/20 Javascript
JavaScript ES6中export、import与export default的用法和区别
2017/03/14 Javascript
JavaScript插件Tab选项卡效果
2017/11/14 Javascript
Vue Components 数字键盘的实现
2019/09/18 Javascript
[04:29]DOTA2亚洲邀请赛小组赛第一日 TOP10精彩集锦
2015/02/01 DOTA
[40:19]完美世界DOTA2联赛PWL S3 Rebirth vs CPG 第二场 12.18
2020/12/19 DOTA
Python程序设计入门(3)数组的使用
2014/06/16 Python
Python实现PS图像明亮度调整效果示例
2018/01/23 Python
详解PANDAS 数据合并与重塑(join/merge篇)
2019/07/09 Python
解决TensorFlow训练内存不断增长,进程被杀死问题
2020/02/05 Python
Django 5种类型Session使用方法解析
2020/04/29 Python
python能开发游戏吗
2020/06/11 Python
CSS3改变浏览器滚动条样式
2019/01/04 HTML / CSS
用canvas显示验证码的实现
2020/04/10 HTML / CSS
欧洲第一的摇滚和金属乐队服装网站:EMP
2017/10/26 全球购物
复古服装:RetroStage
2019/05/10 全球购物
环保志愿者活动方案
2014/08/14 职场文书
重阳节标语大全
2014/10/07 职场文书
如何利用JavaScript实现二叉搜索树
2021/04/02 Javascript
教你使用一行Python代码玩遍童年的小游戏
2021/08/23 Python
MySQL定时备份数据库(全库备份)的实现
2021/09/25 MySQL