问题描述:

使用 Vue-cli 创建的项目,开发地址是 localhost:8080,需要访问 localhost:9000 或https://m.maoyan.com或http://image.baidu.com上的接口

分析原因:

不同域名之间的访问,需要跨域才能正确请求。跨域的方法很多,通常都需要后台配置

不过 Vue-cli 创建的项目,可以直接利用 Node.js 代理服务器,实现跨域请求

如果使用了 axios,可以全局配置一个 baseURL,这样就不用挨个儿修改 url 了

axios.defaults.baseURL = '/api'

大家经常用的方法:

在 config>index.js 的 dev 中添加配置项 proxyTable:

    proxyTable: {

      //本地调试
'/api': { //这里是我配置的名字
target: 'http://m.maoyan.com', //你要请求的第三方接口
changeOrigin: true, //开启代理:在本地会创建一个虚拟服务端,然后发送请求的数据,并同时接收请求的数据,这样服务端和服务端进行数据的交互就不会有跨域问题
pathRewrite: {'^/api': '/'} //这里重写路径运行后就代理到对应地址 /*
想请求接口是 http://m.maoyan.com/ajax/movieOnInfoList?token= target 是 目标服务器地址 本地代理服务器请求数据的时候它会把我们本地的 http:localhost:8080 替换成 http://m.maoyan.com
changeOrigin: true, //开启代理:在本地会创建一个虚拟服务端,然后发送请求的数据,并同时接收请求的数据,这样服务端和服务端进行数据的交互就不会有跨域问题
pathRewrite: {'^/api': '/'} //这里重写路径运行后就代理到对应地址
如果不写这个.我们本请求的路径是 /api/ajax/movieOnInfoList?token= ,
本地代理服务器补全路径后 就是 http:localhost:8080/api/ajax/movieOnInfoList?token=
这和原 接口地址 比较 是 域名不一样(这个在target已经处理过了, 相当于一样了) , 还多了一个 /api,所
以我们要把他处理掉, 通过pathRewrite: {'^/api': '/'} ,意思是 把 '/api' 替换成 '/',
这样 本地代理服务器请求地址就变成 http:localhost:8080//ajax/movieOnInfoList?token=
(接口于接口之间多写/ 没事会自动处理掉,上面也可以写成 pathRewrite: {'^/api': ''} ),
但是这样写不好, 接口于接口之间放个空 语义不强, 所以建议放个 '/' */ } },

经过上面的配置就可以这样去请求 https:m.maoyan.com 上的接口了。

async mounted(){
let data = await data = await this.$http.get('/api/ajax/movieOnInfoList?token=');
console.log(data);
}

我这里$http就是axios, 因为我这里把axios挂载到了vue实例上,并重命名为 $http

import axios from 'axios'  //引入 axios 异步请求工具 插件

import store from './store';

Vue.prototype.$http = axios;
// 把 axios 方法 通过 原型 挂载 到vue根实例上(自定义key值为$http,vue实例也是一个对象嘛,所以可以自定义),
// 这样 在vue项目里哪里都可以用了,不用单个mport axios from 'axios' 引入了。
//就可以以 this.$http.get().then(function(){}).catch(function(){}) 的形式去使用了,post 请求类似 get请求。

这样对只跨域请求一个域名上的数据,就完成了。当时我们有时候要跨域请求多个域名怎么办呢?

例如: 我们即要请求  https://m.maoyan.com上的接口,又要请求  http://image.baidu.com上的接口。

这是后我们这要再配一个就代理就行了。代码如下:

    proxyTable: {

      //本地调试
'/api': { //这里是我配置的名字
target: 'http://m.maoyan.com', //你要请求的第三方接口
changeOrigin: true, //开启代理:在本地会创建一个虚拟服务端,然后发送请求的数据,并同时接收请求的数据,这样服务端和服务端进行数据的交互就不会有跨域问题
pathRewrite: {'^/api': '/'} //这里重写路径运行后就代理到对应地址 /*
想请求接口是 http://m.maoyan.com/ajax/movieOnInfoList?token= target 是 目标服务器地址 本地代理服务器请求数据的时候它会把我们本地的 http:localhost:8080 替换成 http://m.maoyan.com
changeOrigin: true, //开启代理:在本地会创建一个虚拟服务端,然后发送请求的数据,并同时接收请求的数据,这样服务端和服务端进行数据的交互就不会有跨域问题
pathRewrite: {'^/api': '/'} //这里重写路径运行后就代理到对应地址
如果不写这个.我们本请求的路径是 /api/ajax/movieOnInfoList?token= ,
本地代理服务器补全路径后 就是 http:localhost:8080/api/ajax/movieOnInfoList?token=
这和原 接口地址 比较 是 域名不一样(这个在target已经处理过了, 相当于一样了) , 还多了一个 /api,所
以我们要把他处理掉, 通过pathRewrite: {'^/api': '/'} ,意思是 把 '/api' 替换成 '/',
这样 本地代理服务器请求地址就变成 http:localhost:8080//ajax/movieOnInfoList?token=
(接口于接口之间多写/ 没事会自动处理掉,上面也可以写成 pathRewrite: {'^/api': ''} ),
但是这样写不好, 接口于接口之间放个空 语义不强, 所以建议放个 '/' */ }, //因为我们 登录页的 请求接口 是 https://i.meituan.com 所以我们要在配一个代理: //本地调试 /*
注意这里不能用 '/api/baidu' 因为 这样当你到调用的时候
(原始接口: http://image.baidu.com/search/wisejsonala?tn=wisejsonala&ie=utf8&cur=result&word=%E6%91%84%E5%BD%B1%E5%B8%88%E9%99%88%E7%A3%8A&fr=&catename=&pn=0&rn=3&gsm=1e000000001e )
你调用的是后 会这样写 this.$http.get('/api/baidu/search/wisejsonala?tn=wisejsonala&ie=utf8&cur=result&word=%E6%91%84%E5%BD%B1%E5%B8%88%E9%99%88%E7%A3%8A&fr=&catename=&pn=0&rn=3&gsm=1e000000001e')
这样就 会先匹配到 '/api' 这个暗号,代理请求到 http://m.maoyan.com, 但这并不是我们想要的,所以我们得重新写一个区别于上上面的暗号。
因为这个地方因为个人爱好的问题。 要统一写 '/api' 这个形式,可以把 猫眼域名 的暗号 改成 '/api/maoyan', 把 百度域名的暗号 改成 '/api/baidu' 这样就有统一的入口 '/api' 了。
我这里不统一改了。因为上面 的 '/api' 用的地方挺多的,这里一改,其他地方也要动。 统一管理的代码:
'/api/maoyan': { //这里是我配置的名字
target: 'http://m.maoyan.com', //你要请求的第三方接口
changeOrigin: true, //开启代理:在本地会创建一个虚拟服务端,然后发送请求的数据,并同时接收请求的数据,这样服务端和服务端进行数据的交互就不会有跨域问题
pathRewrite: {'^/api/maoyan': '/'} //这里重写路径运行后就代理到对应地址
},
'/api/baidu': { //这里是我配置的名字
target: 'http://image.baidu.com', //你要请求的第三方接口
changeOrigin: true, //开启代理:在本地会创建一个虚拟服务端,然后发送请求的数据,并同时接收请求的数据,这样服务端和服务端进行数据的交互就不会有跨域问题
pathRewrite: {'^/api/baidu': '/'} //这里重写路径运行后就代理到对应地址
} 使用时:
1: this.$http.get('/api/maoyan/ajax/movieOnInfoList?token=');
2: this.$http.get('/api/baidu/search/wisejsonala?tn=wisejsonala&ie=utf8&cur=result&word=%E6%91%84%E5%BD%B1%E5%B8%88%E9%99%88%E7%A3%8A&fr=&catename=&pn=0&rn=3&gsm=1e000000001e');
*/ '/baidu': { //这里是我配置的名字
target: 'http://image.baidu.com', //你要请求的第三方接口
changeOrigin: true, //开启代理:在本地会创建一个虚拟服务端,然后发送请求的数据,并同时接收请求的数据,这样服务端和服务端进行数据的交互就不会有跨域问题
pathRewrite: {'^/baidu': '/'} //这里重写路径运行后就代理到对应地址 } },

测试使用'/baidu'  :

        async mounted(){
// let data = await this.$http.post('https://i.meituan.com/account/custom/mobilelogincode2');
let data = await this.$http.get('/baidu/search/wisejsonala?tn=wisejsonala&ie=utf8&cur=result&word=%E6%91%84%E5%BD%B1%E5%B8%88%E9%99%88%E7%A3%8A&fr=&catename=&pn=0&rn=3&gsm=1e000000001e'); console.log(data);
}

输出:

成功了。

上面注释挺多的,可能看着眼晕,我在附一张简单 的。

这样就实现了跨域向多个域名请求了。

Vue-cli 创建的项目配置跨域请求(通过反向代理)---配置多个代理--axios请求的更多相关文章

  1. vue cli创建typescript项目

    使用最新的Vue CLI @vue/cli创建typescript项目,使用vue -V查看当前的vue cli版本 安装命令 npm install -g @vue-cli 创建项目 vue cre ...

  2. Vue-cli 创建的项目如何跨域请求

    感谢BeArchitect的技术支持 问题描述: 使用 Vue-cli 创建的项目,开发地址是 localhost:8023,需要访问 localhost:9000 上的接口 分析原因: 不同域名之间 ...

  3. vue cli创建的项目 当你后期使用了ES6语法,如何解决浏览器兼容问题

    最近开发了一个项目,开发过程中,由于需要使用了async await ,于是发现,只有少数的浏览器支持,极大多数的浏览器是不支持这玩意的,在网上各种找解决方案,基本都是失败,最后总结了两个方案之后,尝 ...

  4. 用vue ui创建的项目怎么关闭eslint校验

    在Vue Cli的控制面板找到配置-ESLint configuration,然后关闭保存时检查就可以了

  5. 解决@vue/cli 创建项目是安装chromedriver时失败的问题

    最近在使用新版vue的命令行工具创建项目时,安装chromedriver老是失败,导致后面的步骤也没有进行.网上搜索了一下,全是使用 工作中常见问题汇总及解决方案 npm install chrome ...

  6. vue开发环境配置跨域,一步到位

    本文要实现的是:使用vue-cli搭建的项目在开发时配置跨域,上线后不做任何任何修改,接口也可以访问,前端跨域解决方案 production:产品 生产环境 development:开发 开发环境 1 ...

  7. SpringBoot + react app 项目,解决跨域问题的配置(跳坑含泪总结,亲测有效)

    方法一: 对某一接口配置,可以在方法上添加 @CrossOrigin 注解 @CrossOrigin(origins = {"http://localhost:8110", &qu ...

  8. uniapp 封装 request 并 配置跨域,( 本地 + 线上 + 封装 )

    找到上面这个 文件,不管是用 命令创建 还是 用 HBX 创建,都一样会有这个文件的,然后跟着截图复制粘贴就好了. // 这是配置本地能跨域的,或者你可以直接让后端给你设置请求头,避免了跨域. &qu ...

  9. VUE006. 前端跨域代理服务器ProxyTable概述与配置

    概述 使用  vue-cli  工具生成一个  vue  项目: vue init webpack my-project-vue 在生成的项目结构里,会有一个  index.js  文件.在这个文件里 ...

  10. Vue中应用CORS实现AJAX跨域,及它在 form data 和 request payload 的小坑处理

    基本概念部分(一):理解CORS 说道Vue的跨域AJAX,我想先梳理一遍CORS跨域,"跨域资源共享"(Cross-origin resource sharing),它是一个W3 ...

随机推荐

  1. mysql 与linux ~ 内存分析与调优

    一 简介:linux内存和mysql二 分类   1 用户空间和内核空间      用户空间内存,从低到高分别是五种不同的内存段      1 只读段 包含代码和常量等      2 数据段 包含全局 ...

  2. 如何在eclipse安装apk包

    如何在eclipse安装下载好的apk包 好像是有好几种方法,我成功的是这种. 1.首先启动模拟器,我选择的是Android 4.2.2,因为...默认安得Android 7.1.1起不了,真是大坑, ...

  3. linux 软件包管理介绍

  4. shell编程 之 引号、括号的用法总结

    1 单引号 a=1 b='a string' 单引号屏蔽各种特殊字符.echo ‘$a " % \n ' 只能得到 $a " % \n 单引号可以指明界限,防止由分隔符----空格 ...

  5. .net 项目与网站区别

    背景 .net 的又一个杰作,我作为资深开发人员,好久没搞明白两者关系,后来慢慢总算琢磨明白了.在2003和2005的时候,都是用的网站方式,后来见到某同事用的项目方式,当时还很不理解,真是个傻瓜程序 ...

  6. CAN总线相关的几个gitlab代码

    https://github.com/brtiberio/ATV71_CANopen.git https://github.com/linux-can/can-utils.git https://gi ...

  7. python连接kafka生产者,消费者脚本

    # -*- coding: utf-8 -*- ''''' 使用kafka-Python 1.3.3模块 # pip install kafka==1.3.5 # pip install kafka- ...

  8. MVC、MVP、MVVM模式

    MVC,MVP和MVVM都是常见的软件架构设计模式(Architectural Pattern),它通过分离关注点来改进代码的组织方式.不同于设计模式(Design Pattern),只是为了解决一类 ...

  9. 运输层TCP/UDP

    UDP:用户数据报协议 客户不与服务器建立连接,它只管用函数sendto给服务器发送数据报,此函数要求目的地址(服务器)作为其参数.类似的,服务器不从客户接受连接,它只管调用函数recvfrom,等待 ...

  10. Linux命令之top、ulimit、free

    1.[ulimit命令] ulimit命令用来限制系统用户对shell资源的访问. 假设有这样一种情况,当一台 Linux 主机上同时登陆了 10 个人,在系统资源无限制的情况下,这 10 个用户同时 ...