React 入门:脚手架代理配置

news2024/11/24 18:29:52

文章目录

  • React Ajax
  • Axios
  • 在 React 中使用 Axios
  • 脚手架代理配置

React Ajax

  • 理解

    • React 本身只关注于界面,并不包含发送 ajax 请求的代码。
    • 前端应用需要通过 ajax 请求与后台进行交互(json 数据)。
    • React 应用中需要继承第三方 ajax 库(或自己封装)。
  • 常用 ajax 请求库

    • jQuery:比较重,如果需要另外引入,不建议使用。
    • axios:轻量级,推荐使用

Axios

Axios 是一个基于 promise 的网络请求库,可以用于浏览器和 node.js。

在服务端它使用原生 node.js http 模块, 而在客户端 (浏览端) 则使用 XMLHttpRequests。

  • 特性

    • 从浏览器创建 XMLHttpRequests
    • 从 node.js 创建 http 请求
    • 支持 Promise API
    • 拦截请求和响应
    • 转换请求和响应数据
    • 取消请求
    • 自动转换 JSON 数据
    • 客户端支持防御 XSRF
  • 安装

    • npm 安装命令:
    npm install axios
    
    • 通过 Yarn 安装:
    yarn add axios
    

    想学习和了解更多 axios 内容,请访问 Axios 中文网

在 React 中使用 Axios

通过一个简单的代码实例来演示,这里需要提前准备好两个 api 服务器,如果没有准备好,请阅读上一篇文章,代码如下:

// file: src/App.js

import React, { Component } from "react";
import axios from "axios"; // 导入 axios

export default class App extends Component {
  getStudentData = () => {
    axios.get("http://127.0.0.1:5000/students").then(
      (response) => {
        console.log("成功:", response.data);
      },
      (error) => {
        console.log("失败:", error);
      }
    );
  };
  getCarsData = () => {
    axios.get("http://127.0.0.1:5001/cars").then(
      (response) => {
        console.log("成功:", response.data);
      },
      (error) => {
        console.log("失败:", error);
      }
    );
  };

  render() {
    return (
      <div>
        <button onClick={this.getStudentData}>点我获取学生数据</button>
        <button onClick={this.getCarsData}>点我获取汽车数据</button>
      </div>
    );
  }

首先运行 node server1.jsnode server2.js 命令,启动两台服务器;
然后运行 React 代码,点击界面上的【点我获取学生数据】按钮和【点击获取汽车数据】按钮,浏览器控制台都会报出如下跨域问题:
在这里插入图片描述

扩展
基于上面的问题,简单介绍一下跨域相关概念。

  • 首先,什么是跨域呢?
    跨域指的是浏览器不能执行其他网站的脚本,简单来说是浏览器同源政策的限制,浏览器针对于 ajax 的限制。
  • 同源政策
    两个页面拥有相同的协议,端口,域名 就是同源,如果有一个不相同就是不同源。同源政策产生的目的是为了保护用户信息安全,防止一些网站盗取用户信息。

那么,在 React 中如何解决跨域的问题呢?这就引出了本文的正题,—— 代理。(当然还可以通过其他方式解决跨域问题,如 jsonp、nginx 反向代理等。)

脚手架代理配置

  • 什么是代理
    常说的代理就是一个代理服务器,例如 A 服务器请求 B 服务器,我们可以通过代理 C 服务器去帮助我们请求,产生的跨域原因就是浏览器的同源政策是针对于 ajax 的请求,并不限制服务器之间的通信传输,而这个代理服务器正是和我相同端口域名的,我只需去用代理服务器去发请求再去接收,从而达到跨域。

  • 两种配置方式

    • 方式一
      在 package.json 中追加如下代码:

      "proxy": "http://127.0.0.1:5000"
      

      说明

      • 优点:配置简单,前端请求资源时可以不加任何前缀。
      • 缺点:不能配置多个代理。
      • 工作方式:上述方式配置代理,当请求了 3000 不存在的资源,那么该请求会转发给 5000(优先匹配前端资源)。

      实战

      • 首先,上面 App.js 中的 getStudentData 方法中 axios.get 第一个参数请求 url 中的 端口要改成 3000,代码如下:

        getStudentData = () => {
          axios.get("http://127.0.0.1:3000/students").then(
            (response) => {
              console.log("成功:", response.data);
            },
            (error) => {
              console.log("失败:", error);
            }
          );
        };
        
      • 然后,在 package.json 中第一层添加 "proxy": "http://127.0.0.1:5000",注意一定要不要写错位置了,可参照下面的截图:
        在这里插入图片描述

      • 最后,由于更改了 package.json 文件,需要运行 yarn start 重启 React 应用,代理才能起作用,此时在浏览器中打开的页面中点击【点我获取学生数据】按钮,就可以正常返回数据了,截图如下: 在这里插入图片描述

    • 方式二
      第一步,创建代理配置文件。在 src 下创建配置文件:src/setupProxy.js。
      第二步,编写 setupProxy.js 配置具体代理规则:

      // file:src/setupProxy.js
      
      const proxy = require("http-proxy-middleware");
      
      module.exports = function (app) {
        app.use(
          // /api1是需要转发的请求(所有带有/api前缀的请求都会转发给5000)
          proxy("/api1", {
            target: "http://127.0.0.1:5000", // 配置转发目标地址(能返回数据的服务器地址)
            changeOrigin: true, // 控制服务器接收到的请求头中Host字段的值
            /*
              changeOrigin 设置为 true 时,服务器收到的请求头中的 host 为:localhost:5000
              changeOrigin 设置为 false 时,服务器收到的请求头中的 host 为:localhost:3000
              changeOrigin 默认为 true ,但我们一般将 changeOrigin 值设为 true
             */
            pathRewrite: { "^/api1": "" }, // 重写请求路径,去除请求前缀,保证交给后台服务器的是正常请求地址(必须配置)
          }),
          proxy("/api2", {
            target: "http://127.0.0.1:5001",
            changeOrigin: true,
            pathRewrite: { "^/api2": "" },
          })
        );
      };
      

      说明

      • 优点:可以配置多个代理,可以灵活的控制请求是否走代理。
      • 缺点:配置繁琐,前端请求资源时必须加前缀。

      实战

      • 首先,确保已经在 src 下创建配置了 setupProxy.js 文件,且正确编写了代理规则;

      • 然后,修改 App.js 中的 axios 请求地址,代码如下:

        getStudentData = () => {
          axios.get("http://localhost:3000/api1/students").then(
            (response) => {
              console.log("成功:", response.data);
            },
            (error) => {
              console.log("失败:", error);
            }
          );
        };
        getCarsData = () => {
          axios.get("http://localhost:3000/api2/cars").then(
            (response) => {
              console.log("成功:", response.data);
            },
            (error) => {
              console.log("失败:", error);
            }
          );
        };
        
      • 最后,需要运行 yarn start 重启 React 应用,代理才能起作用,此时在浏览器中打开的页面中分别点击【点我获取学生数据】按钮和【点我获取汽车数据】按钮,就可以正常返回数据了,截图如下: 在这里插入图片描述

      如果浏览器报错如下:
      setupProxy VM200:6772 crbug/1173575, non-JS module files deprecated

      解决方式是,使用下面的新的写法:

      // file:src/setupProxy.js
      
      const proxy = require("http-proxy-middleware");
      
      module.exports = function (app) {
        app.use(
          // /api1是需要转发的请求(所有带有/api前缀的请求都会转发给5000)
          proxy.createProxyMiddleware("/api1", {
            target: "http://127.0.0.1:5000", // 配置转发目标地址(能返回数据的服务器地址)
            changeOrigin: true, // 控制服务器接收到的请求头中Host字段的值
            /*
              changeOrigin 设置为 true 时,服务器收到的请求头中的 host 为:127.0.0.1:5000
              changeOrigin 设置为 false 时,服务器收到的请求头中的 host 为:127.0.0.1:3000
              changeOrigin 默认为 true ,但我们一般将 changeOrigin 值设为 true
             */
            pathRewrite: { "^/api1": "" }, // 重写请求路径,去除请求前缀,保证交给后台服务器的是正常请求地址(必须配置)
          }),
          proxy.createProxyMiddleware("/api2", {
            target: "http://127.0.0.1:5001",
            changeOrigin: true,
            pathRewrite: { "^/api2": "" },
          })
        );
      };
      

    无论使用哪种方式,都可以解决上文跨域的问题。

    注意 无论使用哪种代理方式,一定要重新启动 React 才能生效!!!

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

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

相关文章

C++ · 入门 | 准备知识

啊我摔倒了..有没有人扶我起来学习.... &#x1f471;个人主页&#xff1a;《CGod的个人主页》\color{Darkorange}{《CGod的个人主页》}《CGod的个人主页》交个朋友叭~ &#x1f492;个人社区&#xff1a;《编程成神技术交流社区》\color{Darkorange}{《编程成神技术交流社区》…

uniapp实现楼层导航 ,滚动定位,锚点导航

uniapp实现楼层导航的核心技术要点&#xff1a; 1、scroll-view作为视图容器&#xff0c; 2、用其属性scroll-into-view,用于完成点击联动 3、uni.createSelectorQuery().selectAll();获取右侧所有元素信息&#xff0c;获取top值存入数组&#xff0c;用于计算滑动时需要的联动…

Vue-cli工程中每个文件夹和文件的用处

dist 文件夹&#xff1a;默认 npm run build 命令打包生成的静态资源文件&#xff0c;用于生产部署 node_modules&#xff1a;存放npm命令下载的开发环境和生产环境的依赖包 public&#xff1a;有的叫assets&#xff1a;存放项目中需要用到的资源文件&#xff0c;css、js、im…

【Linux】软件包管理器yum

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《学会Linux》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;Linux软件…

未来已来,光伏产业将走向何方?十大趋势待揭晓!

碳中和大背景下&#xff0c;光伏已经成为发展最迅猛的热门产业之一。在能源产业变革中&#xff0c;光伏将成为未来最大的绿电来源。 据预测&#xff0c;到2030年&#xff0c;全球可再生能源的占比将超过50%。届时&#xff0c;光伏发电和风电将成为全球可再生能源的主力军。根据…

Android入门第50天-读写本地文件

简介 为了这个系列&#xff0c;我的代码已经准备到了第150天了。接下来的内容会越来越精彩&#xff0c;我们也越来越开始进入Android的一些高级功能上的编程了。今天我们就要讲Android中对本地文件进行读写的全过程。 课程目标 输入文件名、输入文件内容后按【保存到SD卡】&a…

毕业设计 - 基于SSH的任务调度系统的设计与实现 【源码+论文】

文章目录前言一、项目设计1. 模块设计2. 实现效果二、部分源码项目源码前言 今天学长向大家分享一个 Java web 毕业设计项目: 基于SSH的任务调度系统的设计与实现 一、项目设计 1. 模块设计 根据需求调研结果确定本任务调度系统的功能结构&#xff0c;最终系统实现的系统将…

Django

文章目录基础知识创建项目启动项目创建超级用户创建项目构建个人博客网站简单构建开启本地虚拟环境初步创建blog应用常用的模板标签和过滤器注&#xff1a;常用的模板标签注&#xff1a;常用的过滤器模板嵌套全局模板文件夹模板文件设置建议使用css美化页面导航栏页面美化css框…

捋一捋什么是MySQL插入意向锁?

Insert Intention Lock&#xff0c;中文我们也称之为插入意向锁。 这个可以算是对我们之前所讲的 Gap Lock 的一个补充&#xff0c;关于 Gap Lock&#xff0c;如果还有小伙伴不懂&#xff0c;可以参考&#xff1a;聊一聊MySQL的记录锁、间隙锁与 Next-Key Lock。 1. 为什么需…

Java基础之《netty(14)—异步模型》

一、基本介绍 1、异步的概念和同步相对。当一个异步过程调用发出后&#xff0c;调用者不能立刻得到结果。实际处理这个调用的组件在完成后&#xff0c;通过状态、通知和回调来通知调用者。 2、netty中的I/O操作是异步的&#xff0c;包括Bind、Write、Connect等操作会简单的返…

【云原生 | 47】etcdctl客户端的使用方法详解

&#x1f341;博主简介&#xff1a; &#x1f3c5;云计算领域优质创作者 &#x1f3c5;2022年CSDN新星计划python赛道第一名 &#x1f3c5;2022年CSDN原力计划优质作者 &#x1f3c5;阿里云ACE认证高级工程师 &#x1f3c5;阿里云开发者社区专…

后台基础权限框架搭建实现[木字楠博客]

文章目录1、项目整合SpringSecurity1.1、引入SpringSecurity依赖1.2、启动测试1.3、自定义实体类继承UserDetails1.4、自定义配制文件1.5、重写loadUserByUsername方法1.6、自定义匿名访问注解1.8、编写SpringSecurity配制类后台权限框架搭建&#xff1a;本项目权限主要依赖Spr…

Polynomial Round 2022 (Div. 1 + Div. 2, Rated, Prizes!) A-C

比赛链接 目录 A. Add Plus Minus Sign 题意&#xff1a; 思路&#xff1a; 代码&#xff1a; B. Coloring 题意&#xff1a; 思路&#xff1a; 代码&#xff1a; C. Ice and Fire 题意&#xff1a; 思路&#xff1a; 代码&#xff1a; A. Add Plus Minus Sign 题意…

半导体芯片制造过程可以用哪种测量仪器

近年来&#xff0c;面对持续高涨的芯片需求&#xff0c;半导体行业生产迎来了高难度挑战——对芯片工艺要求更精细&#xff0c;从5nm到3nm&#xff0c;甚至是2nm。“先进封装”的提出&#xff0c;是对技术的新要求&#xff0c;也是对封装工艺中材料和设备的全新考验。 芯片身上…

节点电力市场生产商的战略竞标:凸松弛方法(Matlab实现)

目录 1 电力市场 1.1 什么是电力市场 1.2 电力市场发展历程 1.3 对传统电力系统理论的挑战 2 节点电力市场生产商的战略竞标&#xff1a;凸松弛方法 2.1 简介 2 Matlab代码 1 电力市场 1.1 什么是电力市场 市场&#xff1a;商品交换(交换商品的过程称交易)关系的总和 …

pikachu靶场验证码绕过详解

今天继续给大家介绍渗透测试相关知识&#xff0c;本文主要内容是pikachu靶场验证码绕过详解。 免责声明&#xff1a; 本文所介绍的内容仅做学习交流使用&#xff0c;严禁利用文中技术进行非法行为&#xff0c;否则造成一切严重后果自负&#xff01; 再次强调&#xff1a;严禁对…

endo-BCN-PEG3-Biotin,endo-BCN三聚乙二醇-生物素

【中文名称】endo-BCN三聚乙二醇-生物素 【英文名称】 endo-BCN-PEG3-Biotin&#xff0c;BCN-PEG3-Biotin (endo) 【CAS号】1263166-92-2 【分子式】C29H46N4O7S 【分子量】594.77 【基团部分】BCN 【纯度标准】95% 【外观颜色】 白色固体 &#xff08;具体由其分子量大小决定…

MyBatis学习 | 简介HelloWord

文章目录一、简介二、HelloWord2.1 环境搭建2.2 创建全局配置文件2.3 创建工具类2.4 创建数据库表和对应的JavaBean2.5 创建SQL映射文件2.6 非接口式与接口式编程2.6.1 非接口式编程2.6.2 接口式编程⭐2.7 简单总结学习地址&#x1f517; https://www.bilibili.com/video/BV1mW…

动态规划问题——换钱的方法数

题目&#xff1a; 给定数组arr&#xff0c;arr中所有的值都为正数且不重复。每个值代表一种面值的货币&#xff0c;每种面值的货币可以使用任意张&#xff0c;再给定一个整数aim&#xff0c;代表要找的钱数&#xff0c;求换钱有多少种方法。 举例&#xff1a; arr [5, 10, 2…

【PCL1.11.0+win10+vs2019】环境配置/ 点云格式转换及可视化

文章目录一、安装1.1 下载PCL1.2 安装PCL1.3 安装OSGeo4W二、配置2.1 配置环境变量2.2 配置VS2019三、点云格式转换以及可视化参考一、安装 1.1 下载PCL 首先我们需要下载pcl1.11.0 &#xff0c;这个版本与vs2019对应。 有两种下载方法&#xff1a;百度网盘、官网下载。二选一…