zoukankan      html  css  js  c++  java
  • Vue-cli 创建的项目配置跨域请求(通过*)---配置多个代理--axios请求

     

    问题描述:

    使用 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);
            }

    输出:

    成功了。 

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

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

  • 相关阅读:
    [原]Linux 命令行浏览器
    Linux 命令行浏览器
    [原]Linux 命令行 发送邮件
    Linux 命令行 发送邮件
    [原]Linux 修改时区
    Linux 修改时区
    [原]Ubuntu 下安装Mongodb
    离线解密RDP凭证密码
    [Win]权限维持
    Nginx反向代理
  • 原文地址:https://www.cnblogs.com/taohuaya/p/10177967.html
Copyright © 2011-2022 走看看