博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用vue-axios和vue-resource解决vue中调用网易云接口跨域的问题
阅读量:7250 次
发布时间:2019-06-29

本文共 5935 字,大约阅读时间需要 19 分钟。

使用vue-axios和vue-resource解决vue中调用网易云接口跨域的问题

1. 新建vue项目

1.1 新建项目

新建项目

vue init webpack axios_resource

然后具体设置如下

设置

项目名称,项目描述,作者,Runtime + Compiler 回车即可

注意这里要安装vue-router和ESLint

然后Setup unit tests with Karma + Mocha?Setup e2e tests with Nightwatch?都选择n即可

1.2 安装项目依赖

cnpm install

依赖

1.3 安装axios模块

cnpm install axios --save

1.4 安装resource模块

cnpm install vue-resource --save

1.5 运行项目

cnpm run dev

效果图如下

效果图

1.6 修改页面内容

我们先修改一下页面内容 src\components\Hello.vue

效果图如下

效果图2

2. 使用axios

2.1 我们先修改一下页面,让页面加载一些动态内容

模板修改如下

js部分修改如下

_

然后保存

发现页面有一个报错

http://eslint.org/docs/rules/no-undef 'axios' is not defined

未定义报错

axios没有定义,是因为我们没有导入axios模块的原因

我们在js部分顶部导入一下axios模块

import axios from 'axios'

加载axios模块之后错误提示消失了。

打开调试页面console界面
发现有一个报错

No 'Access-Control-Allow-Origin' header is present on the requested resource.Origin 'http://localhost:8080' is therefore not allowed access.

跨域报错

这里的not allowed access就是提示我们浏览器不支持跨域请求,搜索了很多资料,网易云不支持跨域请求的(网易云的服务器在返回你的请求中没有Access-Control-Allow-Origin这个head字段)。

那怎么办呢?

那我们只能使用代理了。

下面将介绍3种代理方式:1,远程代理 2,php代理 3,node代理

3 代理

3.1 远程代理

就是利用别人写好的代理接口,代理发送你的请求,这样就不会跨域了。

首先我们定义一个常量API_PROXY

const API_PROXY = 'https://bird.ioliu.cn/v1/?url='

然后在axios请求里面拼接一下字符串

axios.get(API_PROXY + 'http://music.163.com/api/playlist/detail?id=19723756')

js 完整代码如下

打开浏览器console界面

Object {data: Object, status: 200, statusText: "OK", headers: Object, config: Object…}config: Objectdata: Objectheaders: Objectrequest: XMLHttpRequeststatus: 200statusText: "OK"__proto__: Object

请求成功

赋值给musics

this.musics = res.data.result.tracks

发现页面有个报错

Uncaught (in promise) TypeError: Cannot set property 'musics' of undefined

musics没有定义

因为这里,this的指向不是当前的vue实例
那我们在使用axios之前重新,定义一下this

var _this = this

axios使用_this就好了

mounted部分代码

mounted: function () {    var _this = this    axios.get(API_PROXY + 'http://music.163.com/api/playlist/detail?id=19723756')    .then(function (res) {      _this.musics = res.data.result.tracks      console.log(_this.musics)    }, function (error) {      console.log(error)    })  }

再打开控制台,发现没有报错,请求的数据也是我们想要的

请求成功1

再次修改一下模板

我们再增加图片数据

修改好的模板如下

完整代码如下

最后效果图如下

最后效果图

_

3.2 php用curl代理

这里演示vue-resource的写法 + php curl 完成代理请求

前面我们安装了vue-resource模块,我们要在main.js加载一下vue-resource模块

加载

import VueResource from 'vue-resource'

使用

Vue.use(VueResource)

为了避免和之前页面混淆,我们重新新增一个curl页面,路由同样新增加一条'/curl'的路由

index.js 完整代码如下

import Vue from 'vue'import Router from 'vue-router'import Hello from '@/components/Hello'import Curl from '@/components/Curl'import VueResource from 'vue-resource'Vue.use(Router)Vue.use(VueResource)export default new Router({  routes: [    {      path: '/',      name: 'Hello',      component: Hello    },    {      path: '/curl',      name: 'Curl',      component: Curl    }  ]})

其实vue-resourceget方法基本上和axios很像,基本上没有太多变动

mounted: function () {    this.$http.get('http://localhost/curl.php', {}, {      headers: {      },      emulateJSON: true    }).then(function (res) {      this.musics = res.data.result.tracks      console.log(this.musics)    }, function (error) {      console.log(error)    })  }

headers get方法里面不用填写参数,如果是post方式发送请求

则要设置Access-Control-Allow-Origin: *

完整代码如下 src\components\Curl.vue

当然了,最重要的是curl.php这个部分代码怎么写了

curl.php 完整代码

";// print_r(json_decode($data));echo $data;//检查是否有错误 if(curl_errno($curl)) { exit('Curl error: ' . curl_error($curl)); } curl_close($curl); //关闭会话

curl请求的话就解释了,大家可以去看手册

最重要的是设置头文件允许跨域

header('Access-Control-Allow-Origin: *');

如果没有设置这个的话,代理也是没有意思的,不然前端还是会提示跨域

当然啦,你要把curl.php这个文件丢在你apache或者nginx根目录,同时apache或者nginx服务器也别忘记启用了哦。

请求成功2

3.3 nodejs代理

同样的我们新建一个Node.vue的模板和/node的路由

{      path: '/node',      name: 'Node',      component: Node    }

index.js 完整代码

import Vue from 'vue'import Router from 'vue-router'import Hello from '@/components/Hello'import Curl from '@/components/Curl'import Node from '@/components/Node'import VueResource from 'vue-resource'Vue.use(Router)Vue.use(VueResource)export default new Router({  routes: [    {      path: '/',      name: 'Hello',      component: Hello    },    {      path: '/curl',      name: 'Curl',      component: Curl    },    {      path: '/node',      name: 'Node',      component: Node    }  ]})

设置代理

打开config/index.js

修改proxyTable: {}部分
修改为

proxyTable: {      '/api': {        target: 'http://music.163.com/api',        changeOrigin: true,        pathRewrite: {          '^/api': ''        }      }    }

第一行的'/api'指的是虚拟路径

target指的是目标地址,也就是实际api的地址
pathRewrite规则重写

然后在代码页面修改一下请求地址

mounted: function () {    this.$http.get('/api/playlist/detail?id=19723756', {}, {      headers: {      },      emulateJSON: true    }).then(function (res) {      this.musics = res.data.result.tracks      console.log(this.musics)    }, function (error) {      console.log(error)    })  }

/api/playlist/detail?id=19723756上面的这个地址其实就等于http://localhost:8080/api+/playlist/detail?id=19723756

注意这里一定要重启一下node,因为你修改了node的配置一定要重启才能生效

在命令符窗口ctrl + c

然后重新执行cnpm run dev
这时候,命令窗口会提示

[HPM] Proxy created: /api  ->  http://music.163.com/api[HPM] Proxy rewrite rule created: "^/api" ~> ""> Starting dev server...

说明代理成功

代理成功

然后访问

请求成功3

就能看到效果了

完整代码 src\components\Node.vue

github地址

原文链接
个人博客

转载地址:http://kqhbm.baihongyu.com/

你可能感兴趣的文章
Spring Cloud Config客户端使用
查看>>
多年经验的大牛总结出来的Python案例超详细
查看>>
Gradle实现Android多渠道定制化打包
查看>>
Ubuntu 16.4下 Docker 安装文档
查看>>
GoJS图表组件简介
查看>>
百度AI开放平台,共建AI生态
查看>>
ES6 fetch函数与后台交互实现
查看>>
盘点5月份GitHub上最热门的开源项目
查看>>
SpringBoot + Dubbo的项目如何优雅停机
查看>>
Eclipse设置源文件的编码方式UTF-8
查看>>
ppt如何导出成高清图片
查看>>
PyQt5教程(七)——控件(II)
查看>>
Vyatta设置
查看>>
Redis核心解读–集群管理工具(Redis-sentinel)(转)
查看>>
删除排序数组中的重复元素java实现
查看>>
com.android.tools.fd.runtime.BootstrapApplication
查看>>
[7/N] 论得趣
查看>>
操作DOM
查看>>
amoeba数据库中间件透明实现MYSQL读写分离
查看>>
gradle入门
查看>>