【码在江湖】前端少侠的json故事(下):jsonp的应用
jsonp的应用


话说天下大势,分久必合,合久必分,代码江湖自进入21世纪以来,前后端分离成为了大势所趋,代码分工更为精细,更为深入,而正所谓码在江湖,身不由己,为了更好的实现需求,程序猿们必须不断学习新的知识,从此踏上了每天给自己挖坑给别人填坑的不归路。
说回正事,上回说到前端少侠dk懂得了一点ng的皮毛功夫就和后端进行数据对接,殊不知get()方法获取json数据失败,究竟是什么原因造成的呢?
跨域访问
当时,我跟樟哥说:樟哥,这次肯定可以的!
然而发送请求的时候就没有数据返回,页面根本没有响应,按下f12,发现network的response报了一条错误,在console里看,返回一条错误信息:
Uncaught SyntaxError: Unexpected token ://谷歌浏览器
SyntaxError: missing ; before statement//火狐浏览器
经查实,这其实是一个跨域访问的错误,什么是跨域访问呢?据一位江湖人士的解答,大概就是这样的:
- 如果在A网站中,我们希望使用Ajax来获得B网站中的特定内容
- 如果A网站与B网站不在同一个域中,那么就出现了跨域访问问题
- Ajax的跨域访问问题是现有的Ajax开发人员比较常遇到的问题
- 一般都会用jsonp方法来解决
于是,我又屁颠屁颠地去找jsonp()了。
寻找ng的jsonp()
网上关于ng的jsonp()说的非常的零散,以至于我把网上关于ng的jsonp()的内容都看了一遍,这一遍便是一整个下午。
网上关于jquery的jsonp倒是挺全的,不过ng的信息就差太远了。
那天下午,我被忽悠把get()换成jsonp(),然后在请求的后面加上一个参数'callback' : 'JSON_CALLBACK':
$http.jsonp("localhost:8080/dkplus",{
params:{
'callback' : 'JSON_CALLBACK',
'tag' : 0,
'id' : 1
}
})
.success(function(data, status, header, config) {
$scope.items = data.data;
})
.error(function(data, status, header, config){
console.log('json解析错误');
})
一开始倒是挺奏效的,我看到response里面返回了一堆json对象,而且都解析出来了,然而还是不走success()方法,走了error()方法。
后来根据网上零零散散的信息,我得知这个需要后端配合,返回的数据格式必须是回调函数名+(+json+),当时看到这个就懵了,大哥你要是给个实例该多好,像我这种初次接触jsonp的人不一定看的懂的。
那时候套用了这个方法还是不行,因为总感觉缺点什么,后来再看一遍,他所说的调用回调函数我并没有定义,于是我就在加一个回调函数JSON_CALLBACK()。
历时一个下午,jsonp()跨域访问终于成功了。
ng的jsonp()最终方案
这里总结一下思路:
使用
jsonp()解决跨域访问,必须在请求的地址后加上参数'callback' : 'JSON_CALLBACK':$http.jsonp("localhost:8080/dkplus",{ params:{ 'callback' : 'JSON_CALLBACK', 'tag' : 0, 'id' : 1 } }) .success(function(data, status, header, config) { $scope.items = data.data; }) .error(function(data, status, header, config){ console.log('json解析错误'); })在js里定义一个方法
JSON_CALLBACK(),用于解析后端返回的数据window.JSON_CALLBACK = function(data){ $scope.items = data.data; }- 后端返回的数据格式为
回调函数名+(+json+)
例如json为:
{ "code": 0, "msg": "返回正常", "data": [ { "content": "你好世界", "stu_name": "dk", "ismyself": 0, "all_hole_id": 8, "release_time": "2016-11-25 20:09:57", "praise_nums": 0 }, { "content": "hello world!", "stu_name": "dk", "ismyself": 0, "all_hole_id": 9, "release_time": "2016-11-25 20:10:03", "praise_nums": 0 } }那么后端应该返回这样的数据
JSON_CALLBACK({ "code": 0, "msg": "返回正常", "data": [ { "content": "你好世界", "stu_name": "dk", "ismyself": 0, "all_hole_id": 8, "release_time": "2016-11-25 20:09:57", "praise_nums": 0 }, { "content": "hello world!", "stu_name": "dk", "ismyself": 0, "all_hole_id": 9, "release_time": "2016-11-25 20:10:03", "praise_nums": 0 } })
这样就可以正常接收和解析json数据了,但是,要注意的是
- 这时候仍然是不走success()方法的
- 之所以能接收和解析数据,是因为它走的是我们定义的回调函数JSON_CALLBACK(),所以得到数据后对数据的操作还得在这个方法里定义。
微信公众号dkplus,由前端少侠dk搭建的分享平台,主攻web前端,但也游离于设计,乐于分享他的代码故事、ps技巧和ppt技巧。码在江湖,身不由己,珍爱生命,简约设计,我是前端,也是设计。博客园:http://www.cnblogs.com/dkplus/
【码在江湖】前端少侠的json故事(下):jsonp的应用的更多相关文章
- 【码在江湖】前端少侠的json故事(上)日月第一击
日月第一击 这是我前端生涯第一次和后台对接,其经历真是苦不堪言,多次绝处逢生,柳暗花明,可就是迟迟见不到那条村子.当然,最后我还是完成了这次对接.下面来聊一聊我这白痴一般的经历. 序章 话说天下大势, ...
- 【码在江湖】前端少侠的json故事(中)ng的json
ng的json 正所谓"人在江湖,身不由己",在开发之路上前端少侠dk遇到过种种困难,尤其在与后端进行数据对接的时候,不得不逼迫自己以极快的速度去学习和掌握一些奇招怪式,正当他以为 ...
- 前端少侠的ps故事
前端少侠的ps故事 正所谓,码在江湖,身不由己.自21世纪前后端分离,代码分工细化以来,前端与设计的合作也变得越来越重要.有人说,如果前端懂设计的话,工作会更快一点.倘若说我入前端半年能算半个前端少侠 ...
- 正确的前端传后台json方式
DEMO: var data=JSON.stringify({"page": {"pagenow": 1,"pagesize": 20},& ...
- arguments.callee 调用函数自身用法----JSON.parse()和JSON.stringify()前端js数据转换json格式
arguments.callee 调用函数自身用法 arguments.callee 在哪一个函数中运行,它就代表哪个函数. 一般用在匿名函数中. 在匿名函数中有时会需要自己调用自己,但是由于是匿名函 ...
- SpringMVC 前端获得定义JSON对象的方法
SpringMVC 前端获得定义JSON对象的方法: 可以使用map进行对象的创建,这样就会解析成键值对,不需要为前端专门定义对象.
- java后端无法接收到前端传递的json对象
java后端无法接收到前端传递的json对象 一·可能是因为未使用@RequestBody 在Controller层中,要么使用@RestController要么使用@Controller+@@Req ...
- jdk1.8源码包下载并导入到开发环境下助推高质量代码(Eclipse、MyEclipse和Scala IDEA for Eclipse皆适用)(图文详解)
不多说,直接上干货! jdk1.8 源码, Linux的同学可以用的上. 由于源码JDK是前版本的超集, 所以1.4, 1.5, 1.6, 1.7都可以用的上. 其实大家安装的jdk路径下,这 ...
- Spring MVC 后端获取前端提交的json格式字符串并直接转换成control方法对应的参数对象
场景: 在web应用开发中,spring mvc凭借出现的性能和良好的可扩展性,导致使用日渐增多,成为事实标准,在日常的开发过程中,有一个很常见的场景:即前端通过ajax提交方式,提交参数为一个jso ...
随机推荐
- vue-router(2.0)
用Vue.js+vue-router创建单页应用是比较简单的.使用Vue.js时,我们就已经把组件组合成一个应用了,当你要把vue-router加进来,只要配置组件和路由映射,然后告诉vue-rout ...
- AutoMapper对internal访问级别属性的映射
最近在使用DDD重新搭建公司内部OA的架构,具体情况搭好了应该会写一下,这里说的是今天遇到的问题. 先简单说一下相关的几个部分: 1.聚合.聚合分成了两个模块:一个包含审批单据等估计至少今年不会怎么变 ...
- MVC5 网站开发之七 用户功能 1、角色的后台管理
角色是网站中都有的一个功能,用来区分用户的类型.划分用户的权限,这次实现角色列表浏览.角色添加.角色修改和角色删除. 目录 奔跑吧,代码小哥! MVC5网站开发之一 总体概述 MVC5 网站开发之二 ...
- 《你不知道的JavaScript》整理(一)——作用域、提升与闭包
最近在读一本进阶的JavaScript的书<你不知道的JavaScript(上卷)>,里面分析了很多基础性的概念. 可以更全面深入的理解JavaScript深层面的知识点. 一.函数作用域 ...
- 【Oracle 集群】11G RAC 知识图文详细教程之RAC在LINUX上使用NFS安装前准备(六)
RAC在LINUX上使用NFS安装前准备(六) 概述:写下本文档的初衷和动力,来源于上篇的<oracle基本操作手册>.oracle基本操作手册是作者研一假期对oracle基础知识学习的汇 ...
- Oracle从文件系统迁移到ASM存储
环境:RHEL 6.4 + Oracle 11.2.0.4 需求:数据库存储由文件系统迁移到ASM 数据库存储迁移到ASM磁盘组 1.1 编辑参数文件指定新的控制文件路径 1.2 启动数据库到nomo ...
- C#泛型方法解析
C#2.0引入了泛型这个特性,由于泛型的引入,在一定程度上极大的增强了C#的生命力,可以完成C#1.0时需要编写复杂代码才可以完成的一些功能.但是作为开发者,对于泛型可谓是又爱又恨,爱的是其强大的功能 ...
- 你真的会玩SQL吗?EXISTS和IN之间的区别
你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...
- 第四篇 Entity Framework Plus 之 Batch Operations
用 Entity Framework 进行 增,删,改.都是基于Model进行的,且Model都是有状态追踪的.这样Entity Framework才能正常增,删,改. 有时候,要根据某个字段,批量 ...
- DbMigration使用方法
1.Enable-Migrations -ContextTypeNameLITCS.Data.gmisContext Enable-Migrations 命令创建了一个新的Migrations文件夹 ...