jsonp的应用

话说天下大势,分久必合,合久必分,代码江湖自进入21世纪以来,前后端分离成为了大势所趋,代码分工更为精细,更为深入,而正所谓码在江湖,身不由己,为了更好的实现需求,程序猿们必须不断学习新的知识,从此踏上了每天给自己挖坑给别人填坑的不归路。

说回正事,上回说到前端少侠dk懂得了一点ng的皮毛功夫就和后端进行数据对接,殊不知get()方法获取json数据失败,究竟是什么原因造成的呢?

跨域访问

当时,我跟樟哥说:樟哥,这次肯定可以的!

然而发送请求的时候就没有数据返回,页面根本没有响应,按下f12,发现networkresponse报了一条错误,在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()最终方案

这里总结一下思路:

  1. 使用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解析错误');
        })
  2. 在js里定义一个方法JSON_CALLBACK(),用于解析后端返回的数据

    window.JSON_CALLBACK = function(data){
        $scope.items = data.data;
    }
  3. 后端返回的数据格式为回调函数名+(+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的应用的更多相关文章

  1. 【码在江湖】前端少侠的json故事(上)日月第一击

    日月第一击 这是我前端生涯第一次和后台对接,其经历真是苦不堪言,多次绝处逢生,柳暗花明,可就是迟迟见不到那条村子.当然,最后我还是完成了这次对接.下面来聊一聊我这白痴一般的经历. 序章 话说天下大势, ...

  2. 【码在江湖】前端少侠的json故事(中)ng的json

    ng的json 正所谓"人在江湖,身不由己",在开发之路上前端少侠dk遇到过种种困难,尤其在与后端进行数据对接的时候,不得不逼迫自己以极快的速度去学习和掌握一些奇招怪式,正当他以为 ...

  3. 前端少侠的ps故事

    前端少侠的ps故事 正所谓,码在江湖,身不由己.自21世纪前后端分离,代码分工细化以来,前端与设计的合作也变得越来越重要.有人说,如果前端懂设计的话,工作会更快一点.倘若说我入前端半年能算半个前端少侠 ...

  4. 正确的前端传后台json方式

    DEMO: var data=JSON.stringify({"page": {"pagenow": 1,"pagesize": 20},& ...

  5. arguments.callee 调用函数自身用法----JSON.parse()和JSON.stringify()前端js数据转换json格式

    arguments.callee 调用函数自身用法 arguments.callee 在哪一个函数中运行,它就代表哪个函数. 一般用在匿名函数中. 在匿名函数中有时会需要自己调用自己,但是由于是匿名函 ...

  6. SpringMVC 前端获得定义JSON对象的方法

    SpringMVC 前端获得定义JSON对象的方法: 可以使用map进行对象的创建,这样就会解析成键值对,不需要为前端专门定义对象.

  7. java后端无法接收到前端传递的json对象

    java后端无法接收到前端传递的json对象 一·可能是因为未使用@RequestBody 在Controller层中,要么使用@RestController要么使用@Controller+@@Req ...

  8. jdk1.8源码包下载并导入到开发环境下助推高质量代码(Eclipse、MyEclipse和Scala IDEA for Eclipse皆适用)(图文详解)

    不多说,直接上干货! jdk1.8 源码, Linux的同学可以用的上. 由于源码JDK是前版本的超集, 所以1.4, 1.5, 1.6, 1.7都可以用的上.     其实大家安装的jdk路径下,这 ...

  9. Spring MVC 后端获取前端提交的json格式字符串并直接转换成control方法对应的参数对象

    场景: 在web应用开发中,spring mvc凭借出现的性能和良好的可扩展性,导致使用日渐增多,成为事实标准,在日常的开发过程中,有一个很常见的场景:即前端通过ajax提交方式,提交参数为一个jso ...

随机推荐

  1. 当master down掉后,pt-heartbeat不断重试会导致内存缓慢增长

    最近同事反映,在使用pt-heartbeat监控主从复制延迟的过程中,如果master down掉了,则pt-heartbeat则会连接失败,但会不断重试. 重试本无可厚非,毕竟从使用者的角度来说,希 ...

  2. c 线程(平行世界)

    我们已经知道如何使用进程来做一些事情了,然而 它并不是在什么地方都是最适合的. 我们看看进程的缺点是什么: 线程隆重登场 1. 如何创建线程 创建线程可以使用多种线程库,在此我们使用最流行的一种:PO ...

  3. Vertica集群单节点宕机恢复方法

    Vertica集群单节点宕机恢复方法 第一种方法: 直接通过admintools -> 5 Restart Vertica on Host 第二种方法: 若第一种方法无法恢复,则清空宕机节点的c ...

  4. 用SignalR 2.0开发客服系统[系列5:使用SignalR的中文简体语言包和其他技术点]

    前言 交流群:195866844 目录: 用SignalR 2.0开发客服系统[系列1:实现群发通讯] 用SignalR 2.0开发客服系统[系列2:实现聊天室] 用SignalR 2.0开发客服系统 ...

  5. mvc过滤器学习(1)

    mvc 过滤器结构图 AuthorizeAttribute AuthorizeAttribute是IAuthorizationFilter的默认实现,添加了Authorize特性的Action将对用户 ...

  6. C语言辗转相除法求2个数的最小公约数

    辗转相除法最大的用途就是用来求两个数的最大公约数. 用(a,b)来表示a和b的最大公约数. 有定理: 已知a,b,c为正整数,若a除以b余c,则(a,b)=(b,c). (证明过程请参考其它资料) 例 ...

  7. Lind.DDD敏捷领域驱动框架~介绍

    回到占占推荐博客索引 最近觉得自己的框架过于复杂,在实现开发使用中有些不爽,自己的朋友们也经常和我说,框架太麻烦了,要引用的类库太多:之前架构之所以这样设计,完全出于对职责分离和代码附复用的考虑,主要 ...

  8. windows 7下React Native环境配置

    React Native 是 Facebook 推出的一个用 Java 语言就能同时编写 ios,android,以及后台的一项技术,它可以做到实时热更新 .FaceBook 也号称这们技术是 “Le ...

  9. XTemplate语法基础

    XTemplate 是富逻辑的 KISSY 模板引擎,面向复杂的业务逻辑场景,同时保持高性能和丰富的配置方法,是易学易懂的模板语言. 一个典型的XTemplate模板实例: Hello {{name} ...

  10. iOS之由身份证号返回性别

    该博文出自:http://www.cnblogs.com/yang-guang-girl/p/5683454.html - (void)viewDidLoad { [super viewDidLoad ...