Vue如何成功调用一个动态数据接口+解决跨域问题

1.安装axios(封装 / 不封装两种方法)
在控制台安装axios依赖,安装依赖包时一定要加 --save,这样会在package.json中声明版本,下次install才能被找到。

cnpm install axios --save

出现下图说明安装成功
在这里插入图片描述
前提
方法一:不封装axios 方法(适合接口不多,要求不高的项目,类似毕设或者小型项目)

<template>
  <div>
    <span>选项一</span>
    <el-button @click="getInfo">获取数据</el-button>
  </div>
</template>
<script>
//在要调用的接口的页面导入axios
import Axios from "axios";
export default {
  //变量区(使用前请加this.)
  data() {
    return {};
  },
  //方法区
  methods: {
  //点击按钮调用该方法get
    getInfo() {
      Axios.get("http://11.345.88.10:8081/menulist")
        .then(res => {
          console.log(res);
        })
        .catch(error => {
            console.log(error)
        });
    }
  }
};
</script>

post方法

 getInfo() {
      Axios.post("http://11.345.88.10:8081/menulist",{orgnCode:"1",account:"admin",password:"123456"})
        .then(res => {
          if(res.data.code==200){
            this.$router.push({path:'/menulist'})
          }
        })
        .catch(error => {
            console.log(error)
        });
    }

方法二:封装axios 方法(适合有大量接口的项目)
1.在src下新建一个文件夹utils,创建文件request.js代码如下:

import axios from 'axios'
const service = axios.create({

  baseURL: '/api', // url = base url + request url
  timeout: 5000 // request timeout
})


// respone拦截器
service.interceptors.response.use(
  response => {
    return response
  },
  error => {
    // 在status不正确的情况下,判别status状态码给出对应响应
    if (error.response) {
      console.log('在respone拦截器检查到错误:')
      switch (error.response.status) {
        case 204:
          error.response.data.error = '204:No Content(没有内容)'
          break
        case 401:
          location.reload() // 刷新页面,触发路由守卫
          error.response.data.error = '401:Unauthorized(未经授权)'
          break
        case 403:
          error.response.data.error = '403:Forbidden(被禁止的)'
          break
        case 500:
          error.response.data.error = '500:服务器内部错误'
          break
        default:
          return error
      }
      return Promise.reject(error.response.data.error)
    }

    return Promise.reject(error)
  }
)

export default service

这就相当于封装了axios

2.在src下新建一个api文件夹,放你的接口
一个js里可以放一个类型的,比如我login里就可以都放和登录相关的接口
在这里插入图片描述
给大家放几个例子
get请求还是post请求,是否需要传参取决于后端接口,根据自己需求更改就可以
例子1:给后台传一组参数post请求,每个js里只需要导入一次request

import request from '@/utils/request.js'
//登录(带参数的post请求,参数类型为对象不是一个具体值)
export function postLogin(data) {
  return request({
    url: '/login',
    method: 'post',
    data
  })
}

例子2,获取全部菜单数据和删除某一条数据

import request from '@/utils/request.js'
//获取菜单全部数据
export function postMenuList() {
  return request({
    url: '/menu/list',
    method: 'get',
  })
}
//删除菜单信息(给后台传一个id,参数类型为一个具体的值)
export function postDeleteMenuById(menuId) {
    return request({
      url: `/menu/delete/${menuId}`,
      method: 'post',
    })
  }

3.调用接口
在页面导入api

import { postLogin } from "@/api/login.js";

在方法中调用该接口

   loginFn() {
      postLogin(this.params).then(res => {
        console.log(res);
        //如果接口调用成功,跳转到mian页面
        if (res.data.code == 200) {
          this.$router.push({ path: "/Main" });
        }
      });
    }

以一个完整的登录代码为例

<template>
  <div class="wrapper">
    <h1>登录</h1>
    <el-form label-position="right" label-width="80px" :model="params" class="loginForm">
      <el-form-item label="组织名">
        <el-input v-model="params.orgnCode"></el-input>
      </el-form-item>
      <el-form-item label="用户名">
        <el-input v-model="params.account"></el-input>
      </el-form-item>
      <el-form-item label="密码">
        <el-input v-model="params.password"></el-input>
      </el-form-item>
      <el-button @click="loginFn()">登录</el-button>
    </el-form>
  </div>
</template>
<script>
import { postLogin } from "@/api/login.js";
export default {
  data() {
    return {
      params: {
        orgnCode: "1",
        account: "admin",
        password: "123456"
      }
    };
  },
  methods: {
    loginFn() {
      postLogin(this.params).then(res => {
        console.log(res);
        //如果接口调用成功,跳转到mian页面
        if (res.data.code == 200) {
          this.$router.push({ path: "/Main" });
        }
      });
    }
  }
};
</script>
<style scoped>
.wrapper {
  text-align: center;
}
.loginForm {
  width: 400px !important;
  margin: 0 auto;
  border: 1px solid gray;
  padding: 20px;
  border-radius: 10px;
}
</style>

.
.
.
解决跨域问题
如果不是本地的接口,就会产生跨域问题(未封装和封装都是这种改法)
修改config下index.js里proxyTable的内容
接口就用例子:http://11.345.88.10:8081/menulist说明
在这里插入图片描述
在这里插入图片描述

代码如下:

 proxyTable: {
      '/api': { //使用"/api"来代替"url地址" 
        target: 'http://11.345.88.10:8081', //源地址 
        // 在本地会创建一个虚拟服务端,然后发送请求的数据,并同时接收请求的数据
        // 这样服务端和服务端进行数据的交互就不会有跨域问题
        changeOrigin: true, //改变源 
        pathRewrite: {
          '^/api': 'http://11.345.88.10:8081' //路径重写 
        }
      }
    },

然后在调用接口的时候改成

 getInfo() {
      Axios.post("/api/menulist")
        .then(res => {
          console.log(res);
        })
        .catch(error => {
            console.log(error)
        });
    }

这个api字段是任意的,如果是封装的axios,就必须与封装的baseURL一致。若没有封装就要如上图自己加在请求路径上把地址换成/api
.
.
.
如果不部署可以不看这个
通过这中方法去解决跨域,打包部署时还按这种方法会出问题。解决方法如下:

let serverUrl = '/api/'  //本地调试时 
// let serverUrl = 'http://11.345.88.10:8081/'  //打包部署上线时 
export default { 
  dataUrl: serverUrl + 'menulist' 
}
  • 6
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue中使用axios调用多个接口跨域问题可以通过设置代理来解决。 1. 首先,在Vue项目根目录下找到config文件夹中的index.js文件。 2. 打开index.js文件,找到dev对象中的proxyTable选项。该选项允许我们配置代理。 3. 在proxyTable选项中添加以下代码: ```javascript proxyTable: { '/api1': { target: 'http://localhost:8000', changeOrigin: true, pathRewrite: { '^/api1': '/api1' } }, '/api2': { target: 'http://localhost:8001', changeOrigin: true, pathRewrite: { '^/api2': '/api2' } } } ``` 此处使用了两个接口作为示例,一个是/api1,另一个是/api2。target参数指定了代理的目标地址,需要根据实际情况进行修改。changeOrigin参数用于配置是否跨域,默认为false,需要设置为true。pathRewrite参数用于重写请求路径,可以根据需要进行修改。 4. 保存并关闭index.js文件。 5. 在Vue组件中使用axios调用接口时,只需要将接口的路径改为对应的代理路径,例如: ```javascript axios.get('/api1/users') .then(response => { // 处理接口1的响应 }) .catch(error => { // 处理接口1的错误 }); axios.get('/api2/posts') .then(response => { // 处理接口2的响应 }) .catch(error => { // 处理接口2的错误 }); ``` 以上代码中,/api1和/api2就是代理路径,可以直接在axios中使用。 通过以上步骤,我们成功解决了在Vue中使用axios调用多个接口跨域问题。注意,在开发环境下使用代理是安全的,但在生产环境要将代理改为实际的服务器地址。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值