继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Vue2.0笔记——Ajax,JSONP跨域

android也疯狂
关注TA
已关注
手记 279
粉丝 39
获赞 245

Ajax实现

vue本身不支持发送AJAX请求,需要使用vue-resource、axios等插件实现。
axios是一个基于Promise的HTTP请求客户端,用来发送请求,也是vue2.0官方推荐的,同时不再对vue-resource进行更新和维护。
参考GitHub上的axios,dist目录下的文件就是axios.min.js。
语法:

axios([options])axios.get(url[,options])    传参方式:        1.通过url传参        2.通过params选项传参

案例:axios([options])

data:{            id:1001        },    methods:{            sendAjax(){                axios({                    method:'get',                    url:'https://api.github.com/users/' + vm.id                }).then(function(resp){ //表示请求成功,将执行的回调函数                    console.log(resp.data);                    vm.user=resp.data;                }).catch(function(){  //请求失败,将执行的回调函数                    console.log('请求失败' + resp.status + ',' + resp.statusText);                });            }        }

在这个代码中,github是一个开源网站,所以可以访问到用户的信息。
1.vm.id表示vm引用当前Vue实例的属性,在后面Vue实例中说明。
2.axios表示执行ajax请求,method选项表示请求方式,url表示请求路径。
3..then回调函数,表示请求成功将被执行,resp为请求成功返回的数据。
4.catch表示请求失败将被执行的回调函数。。

axiso.get(url[,options])

与其类似,但需要注意,第一个参数为url,后面才是选项。

sendAjaxGet(){                axios.get('/user',{                    params:{                        id:1001                    }                }).then(function(resp){                    console.log(resp.data);                    vm.user=resp.data;                }).catch(function(){                    console.log('请求失败' + resp.status + ',' + resp.statusText);                });            }

axios.post(url,data,[options])

post方式请求,第一个参数为请求路径,第二个参数直接就是需要传递的数据,格式为json格式,后面的为选项。

sendAjaxPost(){    axios.post('server.php',{        name:'KaiEr',        age:19    }).then(function(resp){        console.log(resp.data);    }).catch(function(){        console.log('请求失败' + resp.status + ',' + resp.statusText);    });}

还有其他的Request Config请求配置
如:transformRequest

transformRequest: [function (data, headers) {    // Do whatever you want to transform the data    return data;  }],

按照文档的意思是说,在请求数据发到服务器之前对其进行更改,仅适用于'PUT','POST'和'PATCH'。
该值为数组, 数组中最后一个函数应返回一个字符串或Buffer,ArrayBuffer实例。其实返回字符串就可以。
该函数接收的data参数表示传递的数据,即post方式请求的第二个参数。
<br/>
还有如

  • timeout:表示请求超时的毫秒数

  • heads:自定义头部文件

  • responseType:响应类型

  • responseEncoding:响应编码格式

等等,都可以在Github的axios项目的README.md文件中查看文档。
GitHub的axios开源项目

JSONP跨域请求

axios本身并不支持发送跨域的请求,没有提供相应的API。
尽管vue-resource不再维护,但是还可以使用它来进行跨域请求。
您可以考虑使用Jquery.js来进行跨域请求和Ajax请求。然而还有其他使用ajax跨域的更好方法。我们只是说明Vue也可以支持此功能,但如果需要,你任然可以选择。

引入vue-resource.js文件,可以访问Github的vue-resource项目
文档语法:

this.$http.jsonp('/someUrl', [config]).then(successCallback, errorCallback);this.$http.get('/someUrl', [config]).then(successCallback, errorCallback);
  • get(url, [config])

  • head(url, [config])

  • delete(url, [config])

  • jsonp(url, [config])

  • post(url, [body], [config])

  • put(url, [body], [config])

  • patch(url, [body], [config])

Example:

{  // GET /someUrl  this.$http.get('/someUrl').then(response => {    // get body data    this.someData = response.body;  }, response => {    // error callback  });}

案例:
通过跨域请求Baidu的搜索,打开百度,F12,输入a字符,搜索,Ajax请求,network中找到这样一条请求。
https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=a&json=1&p=3&sid=1444_12897_21084_26182_22158&req=2&csor=1&cb=jQuery110209410333632536945_1523889174484&_=1523889174489

wd代表搜索的单词a,我们只需要前边的。
另外我们可以在heads中看到百度使用的jsonp参数名为cb,所以需要修改。

sendJsonp(){    this.$http.jsonp('https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su',{        params:{            wd:'a'        },        jsonp:'cb' //百度使用的jsonp参数名为cb,所以需要修改        }).then(resp => {            console.log(resp.data.s);        });}

通过测试,发现可以得到结果

(10) ["爱奇艺", "阿里云", "安居客", "阿里巴巴", "阿里巴巴批发网", "爱奇艺网", "阿里云邮箱", "安卓模拟器", "爱思助手", "acfun"]

文档访问Github的vue-resource项目

另外,我也不怎么建议使用这个跨域,况且也不是经常用到。
可以使用Jquery,document.domain + iframe跨域以及nodejs中间件代理跨域

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP