基于vue-resource jsonp跨域问题的解决方法


Posted in Javascript onFebruary 03, 2018

最近在学习vue.js 碰到个ajax跨域请求的问题,之前知道可以用jsonp解决,但是一直没实践过,这次用发现里面好多问题,所以现在记录下来,希望可以给刚接触使用jsonp的同学一点帮助!

关于什么是jsonp,以及为什么要用jsonp我就不多说了,不明白的同学自行百度一下。

我们先来说一下jQuery里面的jsonp请求,这搞懂了 vue-resource 里面的jsonp就容易明白了。

这里我以json数据为例,首先我们通过 $.get可以直接得到一个我们想要的对象,但是用 jsonp 就会出现报错代码如下,

$.ajax({
 url:"http://192.168.8.59/weixinvip/VIP/ERP/Home/api.ashx?a=getwxativity&i=1",
 type:"GET",
 dataType:"jsonp",
 sccuess:function(data){
  console.log(data)
 }
})

基于vue-resource jsonp跨域问题的解决方法

这时候我们看到控制台并没有如我们所愿,输出data数据,而是报错了。

这个时候我们查看Network,看到实际上已经请求到了数据

基于vue-resource jsonp跨域问题的解决方法

基于vue-resource jsonp跨域问题的解决方法

我们可以看到请求成功了,状态码200,数据也返回了,但是为什么还是报错了呢?

这就要我们分析下jsonp的原理了:

首先在发送ajax的时候,正常我们是拿到了一段json数据,但是JS是不方便直接操作json数据的,这个时候jQuery已经自动帮我们解析成了一个JS对象;

我们都知道jsonp实际上是相当于用JavaScript加载脚本的方式将数据加载进来的

说到这里我想有些同学大概已经明白为什么会报错了,其实这个时候就是直接在页面中加入了一段script,里面的内容就是返回给我们的数据

<script src="http://192.168.8.59/weixinvip/VIP/ERP/Home/api.ashx?a=getwxativity&i=1"></script>

现在我们再来想想,这段JavaScript代码,其实就是一段没有意义的对象了,因为没有将它赋值个一个变量,你是无法拿到;所以这个时候我们就需要后台同事的配合了,我相信说到这里,大家应该都明白怎么做了,所以jQuery的ajax我们就不多说了。

今天我们主要是说一下vue-resource 里面的jsonp跨域请求问题

闲话不多说,直接上代码:

var vm = new Vue({
 el:'#signRecord',
 data:{},
 beforeMount:function(){
  this.$http.jsonp("http://192.168.8.59/weixinvip/VIP/ERP/Home/api.ashx?a=getwxativity&i=1")
  .then(function(data){
   console.log(data)
  })
 }
})

基于vue-resource jsonp跨域问题的解决方法

同样报错了,而且vue-resource还多给我们报了一个错,我们再来看看network

基于vue-resource jsonp跨域问题的解决方法

基于vue-resource jsonp跨域问题的解决方法

同样请求成功,数据也拿到了,但是就是报错。我们注意看一下请求头,会发现多了一个参数

基于vue-resource jsonp跨域问题的解决方法

基于vue-resource jsonp跨域问题的解决方法

这个参数是干嘛的呢?我们看看源码

基于vue-resource jsonp跨域问题的解决方法

这里我们可以看到,实际上callback是随机生成的字符串,并且这个参数名我们也可以自己给他命名,如果没指定,默认是“callback”,既然

默认传递的参数,那就肯定是有用的。

其实vue发送jsonp还有两个参数,我们来看看

Vue.http.jsonp(url,{params: {pageID:29},jsonp:"_callback"}) //这步就是关键,改callback名

这里params是要发送的数据对象,jsonp是设置回调的名称,也就是上面的callback名称;(不设置默认为callback),现在我们就需要

后台协助一下,获取我们发送过去的"_callpack"的值,将这个值拼接到返回的json数据上,这时候就可以了!

Javascript 相关文章推荐
用jquery实现自定义风格的滑动条实现代码
Apr 26 Javascript
Jquery阻止事件冒泡 event.stopPropagation
Dec 11 Javascript
解析javascript 数组以及json元素的添加删除
Jun 26 Javascript
javascript 处理null及null值示例
Jun 09 Javascript
javascript面向对象特性代码实例
Jun 12 Javascript
DOM基础教程之事件对象
Jan 20 Javascript
js获取页面description的方法
May 21 Javascript
vue2.0开发实践总结之疑难篇
Dec 07 Javascript
vue.js的安装方法
May 12 Javascript
js获取浏览器地址(获取第1个斜杠后的内容)
Sep 03 Javascript
vue+element tabs选项卡分页效果
Jun 29 Javascript
bootstrapValidator表单校验、更改状态、新增、移除校验字段的实例代码
May 19 Javascript
vue.js使用代理和使用Nginx来解决跨域的问题
Feb 03 #Javascript
vue-cli开发时,关于ajax跨域的解决方法(推荐)
Feb 03 #Javascript
JavaScript设计模式之调停者模式实例详解
Feb 03 #Javascript
JavaScript实现求最大公共子串的方法
Feb 03 #Javascript
Node.js实现mysql连接池使用事务自动回收连接的方法示例
Feb 03 #Javascript
js删除数组中的元素delete和splice的区别详解
Feb 03 #Javascript
JS删除数组里的某个元素方法
Feb 03 #Javascript
You might like
ThinkPHP框架实现session跨域问题的解决方法
2014/07/01 PHP
php计算给定时间之前的函数用法实例
2015/04/03 PHP
Laravel 5框架学习之路由、控制器和视图简介
2015/04/07 PHP
php5.3后静态绑定用法详解
2016/11/11 PHP
PHP基于socket实现的简单客户端和服务端通讯功能示例
2017/07/10 PHP
Yii框架的redis命令使用方法简单示例
2019/10/15 PHP
改进:论坛UBB代码自动插入方式
2006/12/22 Javascript
asp.net和asp下ACCESS的参数化查询
2008/06/11 Javascript
JavaScript利用append添加元素报错的解决方法
2014/07/01 Javascript
jquery实现的省市区三级联动
2015/04/02 Javascript
js实现获取div坐标的方法
2015/11/16 Javascript
Laydate时间组件在火狐浏览器下有多时间输入框时只能给第一个输入框赋值的解决方法
2016/08/18 Javascript
AngularJS使用ng-options指令实现下拉框
2016/08/23 Javascript
AngularJS 面试题集锦
2016/09/06 Javascript
浅谈js中几种实用的跨域方法原理详解
2016/12/02 Javascript
jQuery动画_动力节点节点Java学院整理
2017/07/04 jQuery
浅谈Vue2.0父子组件间事件派发机制
2018/01/08 Javascript
jQuery获取随机颜色的实例代码
2018/05/21 jQuery
详解vue2.0监听属性的使用心得及搭配计算属性的使用
2018/07/18 Javascript
python数据结构之二叉树的建立实例
2014/04/29 Python
用python + openpyxl处理excel2007文档思路以及心得
2014/07/14 Python
Python中标准库OS的常用方法总结大全
2017/07/19 Python
Python并发之多进程的方法实例代码
2018/08/15 Python
详解配置Django的Celery异步之路踩坑
2018/11/25 Python
python图像和办公文档处理总结
2019/05/28 Python
python fuzzywuzzy模块模糊字符串匹配详细用法
2019/08/29 Python
详解Python在使用JSON时需要注意的编码问题
2019/12/06 Python
python多进程下的生产者和消费者模型
2020/05/07 Python
python实现模拟器爬取抖音评论数据的示例代码
2021/01/06 Python
python绘制汉诺塔
2021/03/01 Python
美国知名户外用品畅销中心:Sierra Trading Post
2016/07/19 全球购物
2013年高中生自我评价
2013/10/23 职场文书
外贸英语毕业生自荐信
2013/11/14 职场文书
写给女生的道歉信
2014/01/14 职场文书
离婚协议书怎么写
2015/01/26 职场文书
2015高三毕业寄语赠言
2015/02/27 职场文书