跨域不求人,自己动手解决react跨域问题

你是否还在向后端那帮(小可爱)苦苦哀求,

是否还在为接口飘红感到苦恼,

一文解决你在react17/react18中的跨域问题

细节较多,建议全文朗读并背诵

首先,我们来了解一下为什么会跨域

请自行百度 同源策略,谢谢

但是要絮叨一点

为什么为跨域???

因为ajax代理引擎监测到了两个地址违反了同源策略

在此前提,给大家举一个实例

eg: 我在localhost:3000端口 我要求localhost:5000服务的数据

当我们发送一个ajax请求的时候

请求到达5000端口了吗

到达了(不服的小伙伴可以试一下)

那个返回了吗

没有!!!

 3000端口的ajax引擎拒绝了返回的请求,所有产生了跨域

那么为什么代理可以解决跨域呢

我们在配置代理的时候react帮我们生成一个中间人,通过中间人去跟服务端拿数据,那么跨域问题就解决了

Q1: 为什么中间人可以拿到5000端口上的数据呢,代理人不也是在3000端口上吗

A1:因为中间人不遵守ajax引擎策略,所以可能正常在5000端口拿到返回的数据,而客户端是直接向3000端口请求的数据,符合同源策略规范,所以跨域解决,烦恼消失~

 

Q2:我们该怎么写呢

在  react 17.x中 

方法一:我们可以在package.json 中写

注意了注意了

这个时候我们在项目写接口地址的时候就不要写localhost:5000啦!!!

直接写你自己的地址可以了

eg: 我要请求的的接口是 localhost: 5000/xxxx,我们的项目在localhost3000上

那么我们就直接请求localhost:3000/xxxx就可以啦!!

因为你是向你的代理人发送的请求,你的代理就去找5000啦,你就不要管啦!!!

但是!!!

有一个小问题呀!

比如: 我手指头粗,不小心把localhost:3000/xxxx 写成 localhost:3000/index.html了,所以代理人会去找localhost: 5000/index.html吗?

不会啦~

他会直接找你当前项目下的index.html了

他只会在你路径下没有的情况下才会去找5000的

毕竟自己人更亲嘛~

在react17.x中, 如果有多个需要代理的地址怎么办呢?

方法二:

在src路径下,创建setupProxy.js文件(文件名一定要写对!!!,不然react找不到!!)


const proxy = require('http-proxy-middleware');
// 这个玩意不用下,react里自己带了

module.exports = function(app) {
    app.use(
        proxy('/api1', {  // 发送请求的时候 react会自动去找这个api1,匹配这个路径,然后去发送对的请求
            target: 'http://localhost:5000',
            changeOrigin: true, //控制服务器接收到的请求头中host字段的值
            pathRewrite: {'^/api1': ''} // 跟上面匹配,这个api1只是找这个路径用的,实际接口中没有api1,所以找个目标地址后,要把api1给替换成空
        }),
        // changeOrigin设置为true时,服务器收到的请求头中的host为:localhost:5000
        // changeOrigin设置为false时,服务器收到的请求头中的host为:localhost:3000
        // 注意!!注意!!注意!! changeOrigin默认值为false,需要我们自己动手把changeOrigin值设为true
        proxy('/api2', {
            target: 'http://localhost:5001',
            changeOrigin: true,
            pathRewrite: {'^/api2': ''}
        }),
    )
}

在react18中,应该怎么写呢

如果只有一个的话,那就和react17一样啦~

如果多个呢?

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

module.exports = function (app) {
    app.use(
        createProxyMiddleware('/api1', { 
            target: 'http://localhost:5000',
            changeOrigin: true,
            pathRewrite: { '^/api1': '' }
        }),
         createProxyMiddleware('/api2', { 
            target: 'http://localhost:5001',
            changeOrigin: true,
            pathRewrite: { '^/api2': '' }
        }),
    )
}

一奈奈小变化

看到这里的你,学会了吗

感谢您老人家的一键三连~~~

  • 11
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
React 中使用 Axios 进行网络请求时,解决跨域问题可以通过以下方法: 1. 在后端服务器开启 CORS:在后端服务器的响应头中添加 CORS 相关的头信息,允许指定的域名进行跨域访问。可以在后端的响应中添加如下的头信息: ``` Access-Control-Allow-Origin: http://localhost:3000 // 允许访问的域名 Access-Control-Allow-Methods: GET, POST, PUT, DELETE // 允许的请求方法 Access-Control-Allow-Headers: Content-Type // 允许的请求头 ``` 请注意,在生产环境中,应该限制允许跨域访问的域名,避免安全风险。 2. 使用代理服务器:可以在开发环境中使用代理服务器来解决跨域问题。在 React 的配置文件(例如 `package.json` 或 `webpack.config.js`)中,将代理服务器的地址配置为 Axios 请求的基础路径。例如: ```javascript axios.defaults.baseURL = '/api'; // 代理服务器的地址 ``` 然后,在网络请求时,只需使用相对路径即可。 3. JSONP (仅适用于 GET 请求):如果后端支持 JSONP,可以使用 Axios 发送 JSONP 请求来避免跨域问题。通过将 `callback` 参数添加到请求 URL 中,使得响应返回一个函数调用。例如: ```javascript axios.get('http://api.example.com/data?callback=handleResponse') .then(response => { // 处理响应数据 }) .catch(error => { // 处理错误 }); ``` 在全局作用域下定义 `handleResponse` 函数,用于处理响应数据。 以上是一些常见的解决跨域问题的方法,你可以根据你的具体情况选择适合的方法。希望对你有所帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值