Vue3.0中使用Proxy解决Axios请求跨域的问题

本文介绍如何使用Vue3配置文件vue.config.js解决跨域问题,包括通过代理设置实现跨域请求,以及如何在代码中调用接口。

使用Axios进行数据请求的时候可能会遇到跨域问题,如下。
在这里插入图片描述
我们可以通过Vue的proxy来解决跨域的问题。

Vue2.x中在根目录下的config文件夹中index.js文件中dev对象里proxyTable属性进行相应设置即可解决跨域问题,这里不做详细介绍。

Vue3.0中已经没有config文件夹了,所以需要在根目录新建vue.config.js文件

man.js Vue中挂载一下axios

import { createApp } from 'vue'
import axios from 'axios';
import App from './App.vue'
const app = createApp(App)
app.config.globalProperties.$http = axios;
//Vue3.0中不支持Vue.prototype的方式来挂载axios了,改用上面的方法挂载
app.mount('#app')

在新建的vue.config.js文件中写入如下代码

module.exports = {
    publicPath:'./',//静态资源包打包为相对路径
    outputDir:'dist',//输出文件
    devServer:{
        open:false,
        host:'0.0.0.0',
        port:9090,
        hot:true,
        proxy: {
            '/api': {
              target:'http://api.wpbom.com', // 你请求的第三方接口
              changeOrigin:true, // 在本地会创建一个虚拟服务端,然后发送请求的数据,并同时接收请求的数据,这样服务端和服务端进行数据的交互就不会有跨域问题
              pathRewrite:{  // 路径重写,
                '^/Api': ''  // 替换target中的请求地址,也就是说以后你在请求http://api.wpbom.com这个地址的时候直接写成/Api即可。
              }
            }
        },  
    }
}

假如请求的接口地址为 http://api.wpbom.com/api/neran.php ,在调用接口的地方写入如下代码

//----------指定了pathRewrite时------------------//
export default {
  name: 'HelloWorld',
  props: {},
  mounted(){
    this.$http({
      method:'get',
      url:'Api/api/neran.php',//Api就是proxy中的target地址
      data:{}
    }).then(res=>{
      console.log(res)
    }).catch(err=>{
      console.log(err)
    })
  }
}
//-----------未指定PathRewrte时------------------//
export default {
  name: 'HelloWorld',
  props: {},
  mounted(){
    this.$http({
      method:'get',
      url:'/api/neran.php',//没指定BaseUrl路径重写就不需要写了,直接写接口地址就行了。
      data:{}
    }).then(res=>{
      console.log(res)
    }).catch(err=>{
      console.log(err)
    })
  }
}

vue.config.js 文件中proxy对象中的pathRewrite属性可写可不写,区别就是在接口调用时要写上重写路径和不需要写上重写路径。
在这里插入图片描述

Vue单页面应用中,Axios请求出现问题可以通过以下几种方法解决: #### 开发环境下使用代理 在Vue项目中,可以利用`vue.config.js`文件配置开发服务器代理,将请求转发到目标服务器,从而绕过浏览器的同源策略。以下是一个示例配置: ```javascript // vue.config.js module.exports = { devServer: { proxy: { &#39;/api&#39;: { target: &#39;http://your-api-url.com&#39;, // 目标服务器地址 changeOrigin: true, pathRewrite: { &#39;^/api&#39;: &#39;&#39; } } } } } ``` 在上述配置中,所有以`/api`开头的请求都会被代理到`http://your-api-url.com`。例如,在代码中发起`/api/user`的请求,实际上会被转发到`http://your-api-url.com/user`。 #### 后端设置CORS(资源共享) 服务器端可以通过设置响应头来允许请求。以下是不同后端语言的示例: **Node.js(Express框架)** ```javascript const express = require(&#39;express&#39;); const app = express(); app.use((req, res, next) => { res.setHeader(&#39;Access-Control-Allow-Origin&#39;, &#39;*&#39;); // 允许所有名进行调用 res.setHeader(&#39;Access-Control-Allow-Methods&#39;, &#39;GET, POST, PUT, DELETE&#39;); // 允许的请求方法 res.setHeader(&#39;Access-Control-Allow-Headers&#39;, &#39;Content-Type, Authorization&#39;); // 允许的请求头 next(); }); // 其他路由和中间件 app.listen(3000, () => { console.log(&#39;Server is running on port 3000&#39;); }); ``` **Python(Flask框架)** ```python from flask import Flask from flask_cors import CORS app = Flask(__name__) CORS(app) # 允许所有名进行调用 @app.route(&#39;/&#39;) def hello_world(): return &#39;Hello, World!&#39; if __name__ == &#39;__main__&#39;: app.run(debug=True) ``` #### JSONP(JSON with Padding) JSONP是一种古老的解决方案,它利用了`<script>`标签不受同源策略限制的特点。不过,JSONP只支持GET请求。以下是一个简单的示例: **前端代码** ```javascript function handleResponse(data) { console.log(data); } const script = document.createElement(&#39;script&#39;); script.src = &#39;http://your-api-url.com/data?callback=handleResponse&#39;; document.body.appendChild(script); ``` **后端代码(Node.js示例)** ```javascript const http = require(&#39;http&#39;); const server = http.createServer((req, res) => { const url = new URL(req.url, `http://${req.headers.host}`); const callback = url.searchParams.get(&#39;callback&#39;); const data = { message: &#39;Hello, JSONP!&#39; }; const response = `${callback}(${JSON.stringify(data)})`; res.writeHead(200, { &#39;Content-Type&#39;: &#39;application/javascript&#39; }); res.end(response); }); server.listen(3000, () => { console.log(&#39;Server is running on port 3000&#39;); }); ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值