壹 ❀ 引

在上篇bug分析的记录文中,提到axios可做到取消接口请求,所以想写一篇关于axios.CancelToken使用以及原理分析的文章(主要是自己好奇到底如何做到的取消)。在准备工作阶段,我需要在本地写一个发起请求的demo并模拟取消,这样才便于例子分析和理解。但在本地react demo运行的过程中遇到了跨域问题,解决跨域的过程中,也被一些错误的文章所误导,占用了一些时间,因此此篇文章主要详细记录react使用axios如何解决跨域问题(其实跟axios也没啥关系),那么本文开始。

贰 ❀ 开始准备

我的react demo是基于Create React App,这里就不提怎么安装了,具体可参考官方文档或者从零开始的react入门教程(一),让我们从hello world开始一文。于是乎我在终端执行了npm install axios安装 axios

由于我们需要请求一个接口,方便后续的请求展示,我顺手在百度输入了接口测试,于是找到了getman,点击了确认了按钮,打开控制台发现发起了一个请求https://getman.cn/api/request,那么我们也来请求这个地址好了。

于是我在index.js中定义了一个简单的组件,代码如下:

import React, {
Component
} from 'react';
import ReactDOM from 'react-dom';
import axios from 'axios'; class Parent extends Component {
componentDidMount() {
// 我们也来获取这个地址
axios.get('https://getman.cn/api/request')
.then((res) => {
console.log(res)
})
.catch((err) => {
console.log(err)
})
}
render() {
return (
<div>你好,echo。</div>
);
}
} ReactDOM.render(
<Parent />,
document.getElementById('root')
);

npm start运行项目发现报错,看错误信息就知道是跨域了,毕竟我们本地协议以及端口http://localhost:3001/都跟需要请求的地址完全不同。那么就开始着手解决跨域吧,网上也有一些方案,折腾了一番,这里我们使用代理来解决。

叁 ❀ http-proxy-middleware解决跨域

我们需要额外下载一个三方包http-proxy-middleware,在编辑器终端直接执行npm install http-proxy-middleware --save进行安装。安装完毕后,在src目录下新建文件setupProxy.js,具体配置如下:

const {createProxyMiddleware} = require('http-proxy-middleware');
module.exports = function(app) {
app.use(createProxyMiddleware('/api',
{
"target": "https://getman.cn",
"changeOrigin": true,
}))
}

注意,一定是const {createProxyMiddleware} = require('http-proxy-middleware')而不是const proxy = require('http-proxy-middleware'),很多人的博客都是用后面这句,如果这么那就是疯狂报错,完全没效果....

然后回到我们的index.js,修改请求地址的那一句代码为:

// 原代码为
// axios.get('https://getman.cn/api/request')
// 修改为
axios.get('api/request')

保存,刷新页面,你会发现跨域报错已经不存在,而控制台也成功展示了我们请求拿回来的接口数据。

简单解释下这段配置,代理它到底帮我们做了什么。我们可以把本地跑起来的服务理解为用户A,A发起请求,希望去自己所在的服务(我们当前运行的本地项目)的api/request路径下找一个东西,很明显我们项目中没有这个路径,所以常规来说请求http://localhost:3001/api/request一定报404

此时来了个代理商B,他跟我们本地服务A说,你把你要请求的地址告诉我,我帮你转发,帮你访问到你真正想要访问的信息。而我们本地可以发起N种请求,哪些要代理哪些不要代理呢?因此A和B约定了,只要你的请求带有/api,我就帮你转发,转发到哪呢?转发到https://getman.cn

于是A请求了api/request,B发现这个地段里面有/api,于是就去https://getman.cn的目录下找,找什么呢?找api/request,所以最终转发的地址就是https://getman.cn + api/request,所以顺利请求了https://getman.cn/api/request

createProxyMiddleware后的第一个字段,更像是一个约定,同时也是代理商去target寻找的第一级目录,比如我们把代码修改成如下:

// index.js修改为
axios.get('request')
// 配置修改为
module.exports = function(app) {
app.use(createProxyMiddleware('/request',
{
"target": "https://getman.cn/api",
"changeOrigin": true,
}))
}

上述修改中,前端请求request,其实也就是要到服务端request目录下拿个东西,于是代理监听到了,就去https://getman.cn/下找,那这样肯定找不到,所以我们在target进行了手动补全,自己在默认加了/api,这样就成了https://getman.cn/api + request,重新运行项目,你发现也成功请求了。

打开控制台查看我们请求的地址其实是http://localhost:3000/request,但事实上代理帮我们转发,实际访问的是另一个地址,大概如此了。

React axios 使用 http-proxy-middleware 解决跨域问题小记的更多相关文章

  1. Vue使用Axios实现http请求以及解决跨域问题

    Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中.Axios的中文文档以及github地址如下: 中文:https://www.kancloud.cn/y ...

  2. nuxt.js axios使用poxyTable代理,解决跨域问题

    1 安装(@gauseen/nuxt-proxy) cnpm install @gauseen/nuxt-proxy --save 2 配置nuxt.config.js modules: [ // 请 ...

  3. Angular:使用前端proxy代理解决跨域问题

    ①在项目文件的根目录下新建文件proxy.config.json { "/": { "target": "http://127.0.0.1:3000& ...

  4. 解决跨域、同源策略-React中代理的配置

    React中代理的配置 主要是解决同源策略的问题 何为同源策略? 因为我们React在3000端口,Vue在8080端口,而后台接口往往在5000,这种不同的端口之间就是一种跨域的问题了 axios发 ...

  5. axios解决跨域问题(vue-cli3.0)

    一.什么是跨域 1.跨域 指的是浏览器不能执行其他网站的脚本.它是由浏览器的同源策略造成的,是浏览器对javascript施加的安全限制. 2.同源策略 是指协议,域名,端口都要相同,其中有一个不同都 ...

  6. axios解决跨域问题

    最近把我自己的网站升级生成前后端分离的项目(vue+springBoot),不可避免的就遇到了跨域问题.从中学到了许多知识,随便分享出来,也巩固下所学. 谈到跨域,首先得了解CORS(Cross or ...

  7. 【手摸手,带你搭建前后端分离商城系统】02 VUE-CLI 脚手架生成基本项目,axios配置请求、解决跨域问题

    [手摸手,带你搭建前后端分离商城系统]02 VUE-CLI 脚手架生成基本项目,axios配置请求.解决跨域问题. 回顾一下上一节我们学习到的内容.已经将一个 usm_admin 后台用户 表的基本增 ...

  8. 前后端分离djangorestframework——解决跨域请求

    跨域 什么是跨域 比如一个链接:http://www.baidu.com(端口默认是80端口), 如果再来一个链接是这样:http://api.baidu.com,这个就算是跨域了(因为域名不同) 再 ...

  9. Axiso解决跨域访问

    问题: 在项目中需要需要讲本地项目去请求一个URL接口获取数据 例如: 本地请求地址:http://127.0.0.1:19323/site/info.json 请求Url地址:http://www. ...

  10. vue访问外部接口设置代理,解决跨域(vue-cli3.0)

    vue-cli3.0搭建的项目,平时访问内部接口配置了拦截器,今天需要调用天气预报的外部接口,发现跨域问题,通过配置代理解决. 1.在vue.config.js中配置代理 module.exports ...

随机推荐

  1. Listener refused the connection with the following error: ORA-12514

    1.问题 在使用Oracle SQL Developer时,遇到以下问题: 状态: 失败 -测试失败: Listener refused the connection with the followi ...

  2. JS - console多个值

     Promise.all([p1, p2]).then(         (res) => {           let [p1, p2] = res;           console.l ...

  3. SkyWalking的学习之三

    SkyWalking的学习之三 持续优化 SkyWalking 默认可以使用h2,但是感觉容量和性能都可能不太好 所以我想使用一下elasticSearch进行替换. 自己其实一直想心想去学习, 但是 ...

  4. [转帖]Nacos使用2.0.1版本启动出现9848端口错误的解决方式(亲测有效)

    目录 一.背景 二.报错如下 三.报错原因 四.解决方式 一.背景 nacos服务端和客户端都是 2.x版本. centos7使用原始安装nacos单机版,没有使用docker安装naocs集群. 二 ...

  5. [转帖]python库Paramiko

    https://zhuanlan.zhihu.com/p/456447145 测试过程中经常会遇到需要将本地的文件上传到远程服务器上,或者需要将服务器上的文件拉到本地进行操作,以前安静经常会用到xft ...

  6. [转帖]【JVM】Java内存区域与OOM

    引入 Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的"高墙",墙外面的人想进去,墙里面的人却想出来. Java虚拟机运行时数据区 如图所示 1.程序计数器(线程私有 ...

  7. [转帖]Linux命令拾遗-硬件资源观测

    https://www.cnblogs.com/codelogs/p/16060455.html 原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 简介# 这是Linux ...

  8. 二进制安装Mysql数据库的快速方法

    二进制安装Mysql数据库的快速方法 摘要 还是国产操作系统 rpm包可能不太兼容,为了简单准备使用tar包方式安装mysql数据库 这里简单记录一下过程. 为以后使用. 介质下载 下载二进制的tar ...

  9. [转贴]英特尔Sapphire Rapids至强可扩展CPU完整型号爆料与路线图展望

    2022-10-13 15:15· 稿源: cnbeta   腾讯云服务器促销:2核2G首年仅需40元 历史新低   @结城安穗-YuuKi_AnS 刚刚在社交媒体上,分享了与英特尔下一代 Sapph ...

  10. 使用systemd管理多nginx服务以及单nginx服务实现多vhost访问的操作步骤

    背景 nginx是开源的web服务器, 性能与可配置性和插件做的非常完善. 可以使用简单的命令拉起来nginx进行服务提供,但是有时候需要使用keepalive等软件实现保活,以及实现开启启动等,比较 ...