解决 Axios 跨域问题,轻松实现接口调用

news2024/11/17 7:25:16

跨域是指访问另外一个域的资源,由于浏览器的同源策略,默认情况下使用 XMLHttpRequest 和 Fetch 请求时是不允许跨域的。跨域的根本原因是浏览器的同源策略,这是由浏览器对 JavaScript 施加的安全限制。

Axios 跨域常见报错

跨域请求被阻止 (Cross-Origin Request Blocked)

这是由浏览器实施的同源策略导致的错误。浏览器在默认情况下不允许从一个源发送请求到另一个源,除非目标服务器明确授权。如果没有采取任何跨域解决方案,浏览器会拦截该请求,并报告此错误。

无法获取响应内容 (No 'Access-Control-Allow-Origin' header is present on the requested resource)

当使用 CORS (跨域资源共享) 解决方案时,服务器需要在响应头中添加 Access-Control-Allow-Origin 头信息来指示允许访问资源的来源。如果服务器没有正确配置这个头信息或配置不正确,浏览器会报告此错误,表示未经授权无法获取响应内容。

请求出现网络错误 (Network Error)

当跨域请求在发送时出现网络错误(例如目标服务器不可访问、请求超时等),Axios 会捕获这个错误,并将其报告为 "Network Error"。

预检请求失败 (Preflight request failed)

当使用 CORS 发起一些复杂的请求(例如带有自定义头信息或使用 PUT、DELETE 等非简单请求类型),浏览器会在发送真实请求之前发送一个 OPTIONS 预检请求。如果服务器没有正确处理 OPTIONS 请求或未返回正确的预检响应头,浏览器会报告 "Preflight request failed" 错误。

代理服务器错误

如果使用代理服务器作为解决方案,但代理服务器配置有误或不可用,Axios 可能会报告与代理服务器连接相关的错误。

Axios 跨域的解决方法

1. CORS

CORS 需要服务器设置 Access-Control-Allow-Origin 响应头,表示该资源可以被指定的域进行跨域访问。

 
// 服务端代码
res.setHeader('Access-Control-Allow-Origin', '*'); 

2. 服务端启用 CORS

比如 Node.js  Express 启用 CORS:

 
const express = require('express')
const app = express()

app.use(function (req, res, next) {

  // 启用 CORS
  res.header('Access-Control-Allow-Origin', '*');

  next();  
})

3. JSONP

JSONP 的原理是动态插入

 
    import axios from 'axios';

axios.get('/api/user?callback=fetchUser');

function fetchUser(user) {
  console.log(user); 
}

服务端返回 JSON 数据并带上函数调用:

 
  fetchUser({
  name: 'jack'
})

4. 代理服务器

在开发环境下,可以在本地启动一个代理服务器,实现跨域访问。在下面的例子中,客户端可以通过访问代理服务器的 /api/data 路由来获取目标服务器上的数据。

 
    // Node.js 代理服务器
const express = require('express');
const axios = require('axios');
const app = express();
const port = 3000;

app.use(express.json());

app.get('/api/data', async (req, res) => {
  try {
    const response = await axios.get('https://目标服务器的URL/data');
    res.json(response.data);
  } catch (error) {
    res.status(500).json({ error: 'Failed to fetch data from the target server' });
  }
});

app.listen(port, () => {
  console.log(`Proxy server is running on http://localhost:${port}`);
});

Axios 跨域代码实例

假设存在一个需要跨域访问的 API:

 
  
axios.get('http://cross-domain-api.com/users')

可以在本地 3000 端口启动一个 Express 代理服务器:

 
    const express = require('express');
const { createProxyMiddleware } = require('http-proxy-middleware');

const app = express();

app.use('/api', createProxyMiddleware({ 
  target: 'http://cross-domain-api.com', // 跨域目标接口
  changeOrigin: true 
}))

app.listen(3000);

然后修改 axios 请求地址,指向代理服务器即可:

 
axios.get('http://localhost:3000/api/users')
 
## 提示与注意事项
  • 选择跨域解决方案时,考虑到项目的复杂性和需求,选择最合适的方法。
  • JSONP 只支持 GET 请求,不适用于所有场景。
  • CORS 需要服务器端的支持,在一些旧版本的浏览器中可能不完全支持。

使用 Apifox 调试后端接口

Apifox = Postman + Swagger + Mock + JMeter,Apifox 支持调试 http(s)、WebSocket、Socket、gRPC、Dubbo 等协议的接口,并且集成了 IDEA 插件。在后端人员写完服务接口时,测试阶段可以通过 Apifox 来校验接口的正确性,图形化界面极大的方便了项目的上线效率。

总结

Axios 跨域常用的解决方法有 CORS、JSONP、代理等,开发环境可通过代理服务器实现跨域,CORS 需要服务端设置 Access-Control-Allow-Origin 响应头,JSONP 只支持 GET 请求。选择适合项目需求的解决方案能够很好地解决跨域问题,保障应用的正常运行。

知识扩展:

  • FastAPI 与 Flask:Python Web 两大流行框架综合对比
  • Axios 怎么通过 FormData 对象上传文件?

参考资料:

  • MDN - 跨域资源共享CORS:跨源资源共享(CORS) - HTTP | MDN

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

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

相关文章

电子凭证试点深化后,企业如何应对?百望云提供电子凭证一体化解决方案!

今年5月,财政部、税务总局、人民银行、国务院国资委、国家档案局、标准委、国电联办、民航局、国铁集团九单位组织召开电子凭证会计标准深化试点启动会。 电子会计凭证的格式非常多样化,电子会计凭证的处理一直是企业的难点。此次试点工作虽然对企业的财…

SSL证书为什么要选付费?

SSL证书已经越来越多的使用在网站,小程序和APP上,对于保障网络安全,加密数据信息有至关重要的作用。随着SSL证书市场的发展,各种类型的证书产品也在不断丰富,用户在选择SSL证书时,除了可以购买付费证书&…

2023年8月京东白酒行业数据分析(京东数据开放平台)

中秋、国庆“双节”即将到来之际,白酒市场中越来越多的促销手段浮现,除了线下门店,线上电商也推出“百款直降”“限量预约抢购”“百亿补贴”等活动,如习酒消费满额享华为手机,五粮液指定产品满219减120元,…

Spring系列文章:Bean的作⽤域

1、singleton 默认情况下&#xff0c;Spring的IoC容器创建的Bean对象是单例的 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSche…

会声会影2023免费版电脑视频剪辑软件

会声会影视频剪辑软件对硬件配置要求不高&#xff0c;功能强大且涵盖面广&#xff0c;能为用户节省出大量的硬件成本与学习时间成本。大多数用户仅需一周左右的时间就可以掌握会声会影的基本功能模块&#xff0c;会声会影视频剪辑软件&#xff0c;已经拥有了超过20年的品牌历史…

微软hotmail邮箱的存储空间查询

我最近注册了hotmail邮箱&#xff0c;查询到的存储空间如下&#xff1a; 我们关注的存储应该是下面的电子邮箱存储&#xff0c;15 GB&#xff0c;还是比较大的。 而上面的存储是Microsoft账户存储。 我打算用hotmail邮箱以邮件的形式存储一些重要资料。

2024年浙江财经大学MBA招生简章发布:有哪些看点?

2024年研究生招生简章近期正在陆续发布&#xff0c;作为立足浙江十余年的专业机构&#xff0c;杭州达立易考教育带领考生们来认真分析一下各MBA项目的招生政策以及趋势&#xff0c;以方面在接下来的全国研究生考试网报期间顺利选到适合自己的项目&#xff01;本期围绕浙江财经大…

南京融资融券(信用账户)开户利率最低能做到多少?无门槛利率5%!

南京融资融券(信用账户)开户利率最低能做到多少?无门槛利率5%! 信用账户是指一种可以在购物和信贷过程中使用的账户。它通常与信用卡或贷款相关联&#xff0c;在购物或信贷过程中可以使用它来进行支付。 融资融券是一种证券投资方式&#xff0c;可以通过券商开通该服务。以下…

《DevOps实践指南》- 读书笔记(九)

DevOps实践指南 25. 附录附录 1 DevOps 的大融合精益运动敏捷运动Velocity 大会运动敏捷基础设施运动持续交付运动丰田套路运动精益创业运动精益用户体验运动Rugged Computing 运动 附录 2 约束理论和核心的长期冲突附录 3 恶性循环列表附录 4 交接和队列的危害附录 5 工业安全…

【HBuilderX】解决黑色主题中的注释颜色太浅的问题(代码示例)

打开后&#xff0c;搜索Comment&#xff0c;修改&#xff0c;一个是//的颜色&#xff0c;一个是注释内容的颜色

LOG方案整理(持续更新)

LOG方案整理&#xff08;持续更新&#xff09; 一.日志文件格式 基本日志格式主要包含四种内容 1. 事件发生时间 2. 发生事件的主机名 3. 发生事件的服务或程序&#xff08;或内核&#xff09;&#xff0c;包含进程PID 4. 事件内容 二.日志文件分析 内核及大多数系统消息 内核及…

(二十九)大数据实战——kafka集群节点服役与退役案例实战

前言 本节内容是关于kafka集群节点的服役与退役&#xff0c;从而实现kafka集群的缩容与扩容。在开始本节内容之前&#xff0c;我们要预先安装好kafka集群&#xff0c;并准备一台空余的服务器用来完成我们扩容与缩容的案例。关于kafka集群的安装内容这里不在赘述&#xff0c;相…

在微信公众号怎么实现每日签到功能

在微信公众号中实现每日签到功能&#xff0c;可以为企业或公众号运营者带来许多好处。每日签到功能不仅可以增加用户粘性&#xff0c;提高用户参与度&#xff0c;还可以为公众号带来更多的流量和曝光度。那么&#xff0c;如何在微信公众号中实现每日签到功能呢&#xff1f;本文…

Docker中安装Jenkins

本篇主要讲如何在Docker中安装Jenkins&#xff0c;如果Docker未安装&#xff0c;可以先参考上一篇文章进行Docker安装。 【学习Docker&#xff08;一&#xff09;】centos系统 Docker 安装与卸载 安装 拉取镜像 docker pull jenkins/jenkins1 创建 Jenkins 挂载目录 mkdi…

滑动时间窗口的思想和实现,环形数组,golang

固定时间窗口 在开发限流组件的时候&#xff0c;我们需要统计一个时间区间内的请求数&#xff0c;比如以分钟为单位。所谓固定时间窗口&#xff0c;就是根据时间函数得到当前请求落在哪个分钟之内&#xff0c;我们在统计的时候只关注当前分钟之内的数量&#xff0c;即 [0s, 60…

​重生奇迹MU之亚特兰蒂斯​

如果你不喜欢一个玩家&#xff0c;那就让他去亚特兰蒂斯的中心区域去挂机吧&#xff01;因为&#xff0c;那里就是一个禁区般的存在&#xff0c;虽说还没有到达海魔希特拉的老巢&#xff0c;但是那里却驻扎着它最为忠心耿耿的一批手下&#xff0c;而且还是一群拥有法术技能的巫…

基于SSM的化妆品配方及工艺管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

SIT1145AQ收发器芯片CAN FD Passive功能详解(摘自官网)

芯力特在SIT1145AQ/FD版本中加入了CAN FD Passive功能&#xff0c;CAN FD Passive功能简单来说就是SIT1145AQ/FD在休眠或待机模式下屏蔽总线上的CAN FD报文。 为什么需要CAN FD Passive功能呢&#xff1f; SIT1145AQ的特定帧唤醒只支持CAN报文&#xff0c;当SIT1145AQ休眠模式…

和数集团:我国区块链行业发展具有广阔前景

区块链技术正在引领全球新一轮技术变革和产业变革&#xff0c;推动“信息互联网”向“价值互联网”变迁。 公开资料显示&#xff0c;区块链是一种由多方共同维护&#xff0c;使用密码学保证传输和访问安全&#xff0c;能够实现数据一致存储、难以篡改、防止抵赖的记账技术&…

基于el-tooltip组件封装超出显示省略号,鼠标hover显示tooltip的组件

基于el-tooltip组件封装超出显示省略号&#xff0c;鼠标hover显示tooltip的组件 el-tooltip组件存在的问题&#xff1a; el-tooltip没有行超出显示省略号的功能使用了该组件每个hover都会显示tooltip&#xff0c;没有满足超出才显示的需求。 基于el-tooltip组件&#xff0c;…