Vue项目中的AJAX请求与跨域问题解析

一、AJAX请求方式对比与选型

1. 原生XHR方式

基本使用示例

缺点分析

  • 代码冗长复杂

  • 回调地狱问题

  • 需要手动处理JSON转换

  • 错误处理不够直观

2. jQuery的AJAX

基本使用示例

$.ajax({url: 'http://localhost:5000/api/data',type: 'GET',success: function(data) {console.log(data)},error: function(err) {console.error(err)}
})

优缺点分析

  • 优点

    • 简化了原生XHR的使用

    • 解决了浏览器兼容性问题

    • 提供了丰富的配置选项

  • 缺点

    • 引入了整个jQuery库,体积较大

    • 不符合现代前端开发趋势(Vue/React不推荐操作DOM)

    • 回调方式不如Promise直观

3. Fetch API

基本使用示例

fetch('http://localhost:5000/api/data').then(response => {if (!response.ok) {throw new Error('Network response was not ok')}return response.json()}).then(data => console.log(data)).catch(error => console.error('Error:', error))

优缺点分析

  • 优点

    • 浏览器原生支持,无需额外库

    • 基于Promise的现代API

    • 更简洁的语法

  • 缺点

    • IE浏览器完全不支持

    • 需要手动处理JSON转换

    • 错误处理不够直观(不会reject HTTP错误状态)

    • 功能相对简单,缺少拦截器等高级功能

4. Axios

基本使用示例

axios.get('http://localhost:5000/api/data').then(response => console.log(response.data)).catch(error => console.error('Error:', error))

优势分析

  1. Promise风格:解决了回调地狱问题

  2. 浏览器/Node.js通用:同构API设计

  3. 丰富的功能

    • 拦截请求和响应

    • 转换请求和响应数据

    • 自动JSON数据转换

    • 客户端支持防御XSRF

  4. 更好的错误处理:会reject HTTP错误状态

  5. 活跃的社区支持:持续维护更新

选型结论:在Vue项目中推荐使用Axios作为HTTP客户端

二、Axios的安装与使用详解

1. 安装Axios

npm install axios
# 或
yarn add axios

2. 基本使用方式

2.1 发起GET请求
import axios from 'axios'// 方式一:直接使用axios对象
axios.get('/user?ID=12345').then(response => console.log(response.data)).catch(error => console.error(error))// 方式二:使用config对象
axios({method: 'get',url: '/user',params: {ID: 12345}
})
.then(response => console.log(response.data))
2.2 发起POST请求
axios.post('/user', {firstName: 'Fred',lastName: 'Flintstone'
})
.then(response => console.log(response.data))
2.3 并发请求
const getUser = axios.get('/user/12345')
const getPermissions = axios.get('/user/12345/permissions')axios.all([getUser, getPermissions]).then(axios.spread((userResp, permResp) => {console.log(userResp.data, permResp.data)}))

3. 高级配置

3.1 创建实例
const api = axios.create({baseURL: 'https://api.example.com',timeout: 1000,headers: {'X-Custom-Header': 'foobar'}
})
3.2 请求拦截器
axios.interceptors.request.use(config => {// 在发送请求前添加tokenconst token = localStorage.getItem('token')if (token) {config.headers.Authorization = `Bearer ${token}`}return config
})
3.3 响应拦截器
axios.interceptors.response.use(response => response.data, // 直接返回data字段error => {if (error.response.status === 401) {// 处理未授权错误router.push('/login')}return Promise.reject(error)}
)

三、跨域问题解析

1. 跨域现象与原理

同源策略限制的三要素

  1. 协议相同(http/https)

  2. 主机名相同(localhost/example.com)

  3. 端口号相同(8080/5000)

跨域错误提示

Access to XMLHttpRequest at 'http://localhost:5000/api' from origin 'http://localhost:8080' 
has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

实际请求过程

  1. 浏览器发送实际请求前会先发送OPTIONS预检请求

  2. 服务端需要响应预检请求,声明允许的跨域策略

  3. 只有预检通过后,浏览器才会发送真正的请求

2. 跨域解决方案对比

方案实现方式优点缺点适用场景
CORS服务端设置响应头官方标准,前端无需额外处理需要服务端支持生产环境,可控的服务端
JSONP动态创建script标签兼容老浏览器仅支持GET,安全性低需要支持老系统的场景
代理服务器前端服务转发请求前端无需修改,开发环境友好生产环境需要Nginx配置开发环境,前后端分离项目

四、Vue代理方案详解

1. 代理原理说明

浏览器 (http://localhost:8080)→ Vue开发服务器 (http://localhost:8080)→ 实际API服务器 (http://localhost:5000)

 代理服务器充当中间人角色,利用服务端请求不受同源策略限制的特性解决跨域问题。

2. 配置方法

2.1 简单配置(方案一)

vue.config.js:

module.exports = {devServer: {proxy: 'http://localhost:5000'}
}

特点

  • 所有请求都会被代理到目标服务器

  • 无法配置多个后端服务

  • 会优先匹配本地存在的文件

2.2 高级配置(方案二)

vue.config.js:

module.exports = {devServer: {proxy: {'/api': {target: 'http://localhost:5000', // 目标服务器pathRewrite: {'^/api': ''},     // 重写路径changeOrigin: true,             // 修改请求头中的hostws: true                        // 支持websocket},'/api2': {target: 'http://localhost:5001',pathRewrite: {'^/api2': ''}}}}
}

配置项说明

  • target:代理目标地址

  • pathRewrite:路径重写规则

  • changeOrigin:修改请求头中的host值(true时,host会被设置为target)

  • ws:是否代理websocket连接

3. 前端请求示例

// 请求会被代理到 http://localhost:5000/user
axios.get('/api/user').then(response => console.log(response.data))// 另一个服务的请求会被代理到 http://localhost:5001/order
axios.get('/api2/order').then(response => console.log(response.data))

4. 生产环境部署

开发环境使用Vue代理,生产环境推荐使用Nginx反向代理:

server {listen 80;server_name example.com;location /api {proxy_pass http://localhost:5000;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}location / {root /path/to/dist;try_files $uri $uri/ /index.html;}
}

五、最佳实践建议

  1. 开发环境

    • 使用Vue代理方案二

    • 为不同后端服务配置不同前缀

    • 启用changeOrigin避免某些服务器的host校验

  2. 生产环境

    • 使用Nginx反向代理

    • 配置合适的CORS策略(如需)

    • 启用HTTPS加密通信

  3. Axios使用

    • 封装统一的请求实例

    • 添加拦截器处理通用逻辑

    • 对API进行模块化管理

    • 统一错误处理机制

  4. 安全考虑

    • 生产环境限制CORS来源

    • 敏感接口添加身份验证

    • 对代理转发的请求进行适当过滤

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/89973.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/89973.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用 Longformer-base-4096 进行工单问题分类

简述最近接了对Ticket 进行问题分类的任务,使用了prompt和机器学习两种方式来解决,这里重点介绍Longformer-base-4096 模型训练的方案使用 Longformer-base-4096 模型实现文本分类系统,利用 Longformer 处理长序列的能力进行准确分类。该解决…

Matplotlib和Plotly知识点(Dash+Plotly分页展示)

Matplotlib和Plotly知识点(DashPlotly分页展示)0、Matplotlib、Plotly和Dash区别 (推荐用DashPlotly)1.1、Matplotlib (静态图)1. Figures(图形)概念创建Figure保存和显示Figure2. S…

YOLO12论文阅读:Attention-Centric Real-Time Object Detectors

文章链接: 2502.12524https://arxiv.org/pdf/2502.12524 摘要 (Abstract)​​ 长期以来,增强 YOLO 框架的网络架构至关重要,但尽管注意力机制在建模能力方面已被证明具有优越性,改进却主要集中在基于 CNN 的方面。这是因为基于…

秋招Day17 - Spring - 事务

Spring事务的种类编程式事务和声明式事务介绍一下编程式事务管理?通过编程的方式显式控制事务的开始、提交和回滚,一般使用TransactionTemplate的execute方法介绍一下声明式事务管理?基于AOP,通过调用代理对象拦截目标方法&#x…

多维基分析求导法则

对于n维点R0(I1,I2,I3,......In)如果到R(I1, I2 , I3 ,......,In )有基分析求导定理:即R0 R0 *(x1 ,x2 ,x3 ,.............xn) R当I1,I2,....,In独立不能转化时有了独立变量的求导和积分不相干法则…

Java值传递和构造函数

一.Java值传递首先我们来看一串代码:输出 10 20,而不是20 10 这是为什么呢?有内存图可以知道,这个change方法所改变的东西最终没有写回到main之中,且他传的是具体的数据,所以还会输出原数据,就相…

电商项目_秒杀_架构及核心

秒杀架构设计先看下普通web项目架构: (Nginx : 反向代理、负载均衡,一般是运维部分做生产搭建的时候配置好)秒杀架构设计:和普通架构区别:原先由Web 服务或Nginx服务提供的静态资源放到了CDNNginx的职责放⼤…

4x4矩阵教程

4x4矩阵教程 1. 简介 四维矩阵是计算机图形学和3D变换中的重要工具&#xff0c;用于表示三维空间中的仿射变换。本教程将介绍如何使用C实现四维矩阵的基本运算和变换。 2. 代码实现 2.1 头文件 (matrix4x4.h) #ifndef MATRIX4X4_H #define MATRIX4X4_H#include <array> #…

Oracle 数据库共享池与大池调优指南

在 Oracle 数据库的内存管理中&#xff0c;共享池&#xff08;Shared Pool&#xff09;和大池&#xff08;Large Pool&#xff09;是 SGA&#xff08;系统全局区&#xff09;中负责缓存与资源分配的核心组件。合理配置和调优这两个池&#xff0c;能显著提升数据库性能 —— 尤其…

C# Lambdab表达式 Var 类

Lambdab 是用于创建一个方法的表达式Func<参数1类型, 参数2类型, 返回值类型> fnName >(参数1 参数2) {方法代码体}Func<int, int, bool> fnName (int a, int b) > {return a > b; };//调用时和普通方法一致 Console.WriteLine(fnName(10,20)); // false…

【Python】常见模块及其用法

文章目录1. 什么是模块和包&#xff1f;2. 常见的模块及其用法2.1 time概览2.1.1 时间获取方法2.1.2 时间格式化与解析2.1.3 程序计时与延迟2.1.4 时间转换2.2 random概览2.2.1 基本随机数2.2.2 随机整数2.2.3 序列操作2.2.4 概率分布2.2.5 随机种子2.2.6 状态管理2.3 os概览2.…

洛谷 P3478 [POI 2008] STA-Station

【题目链接】 洛谷 P3478 [POI 2008] STA-Station 【题目考点】 1. 树形动规&#xff1a;换根动规 换根动规&#xff0c;又名二次扫描法&#xff0c;一般是给一颗不定根树&#xff0c;通过两次扫描来求解。 我们可以先任选一个根结点root&#xff0c;通过树形动规的思想计算…

【爬虫】03 - 爬虫的基本数据存储

爬虫03 - 爬虫的数据存储 文章目录爬虫03 - 爬虫的数据存储一&#xff1a;CSV数据存储1&#xff1a;基本介绍2&#xff1a;基本使用3&#xff1a;高级使用4&#xff1a;使用示例二&#xff1a;JSON数据存储1&#xff1a;基础json读写2&#xff1a;字符串和对象的转换3&#xff…

深入分析计算机网络数据链路层和网络层面试题

计算机网络体系结构1. 请简述 OSI 七层模型和 TCP/IP 四层模型&#xff0c;并比较它们的异同。OSI 七层模型&#xff1a;应用层&#xff1a;直接为用户的应用进程提供服务&#xff0c;如 HTTP&#xff08;超文本传输协议&#xff0c;用于 Web 浏览器与服务器通信&#xff09;、…

云服务器新装的mysql8,无法通过远程连接,然后本地pymysql也连不上

阿里云服务器&#xff0c;用apt-get新装的mysql-server&#xff0c;竟然无法通过远程连接到&#xff0c;竟然是这个原因。不是防火墙&#xff0c;iptables早就关了。也不是安全组&#xff0c;不是人为限制访问的话&#xff0c;根本没必要弄安全组 排查过程 netstat -antop|grep…

质量即服务:从测试策略到平台运营的全链路作战手册

&#xff08;零&#xff09;为什么需要“质量即服务” 当业务方说“今晚一定要上线”&#xff0c; 当开发说“我只改了两行代码”&#xff0c; 当运维说“回滚窗口只有 5 分钟”&#xff0c; 质量必须像水电一样随取随用&#xff0c;而不是上线前的大坝泄洪。 这篇手册提供一张…

Java -- 自定义异常--Wrapper类--String类

自定义异常&#xff1a;概念&#xff1a;当程序中出现了某些错误&#xff0c;但该错误信息并没有在Throwable子类中描述处理&#xff0c;这个时候可以自己设计异常&#xff0c;用于描述该错误信息。步骤&#xff1a;1. 定义类&#xff1a;自定义异常类名&#xff08;程序员自己…

一文速通《线性方程组》

目录 一、解题必记知识点 二、解题必备技巧 三、非齐次线性方程组求解 四、齐次线性方程组求解 ★五、解析题目信息&#xff0c;获取暗含条件 一、解题必记知识点 (1) (2)基础解系线性无关&#xff0c;基础解系 解空间的一个基&#xff0c;基 一组线性无关的、能够生…

【Django】DRF API版本和解析器

讲解 Python3 下 Django REST Framework (DRF) API 版本控制解析器&#xff08;Parser&#xff09;一、DRF API 版本控制详解 API 版本控制是构建健壮、可维护的 RESTful API 的关键&#xff0c;尤其在项目演进中需要兼容不同版本的客户端请求。 1.1 API 版本控制的核心原理 AP…

Windows系统暂停更新工具

功能说明 暂停更新至2999年恢复系统更新彻底禁用更新&#xff08;不可逆&#xff09; 使用方法 下载解压后双击运行 .bat 文件 输入数字选择功能&#xff1a; 输入 1&#xff1a;暂停更新至2999年&#xff08;推荐&#xff09;输入 2&#xff1a;恢复系统更新输入 3&#xf…