React使用axios库完成前后端通信

1 相关介绍

axios介绍摘自官方文档:

Axios 是一个基于 promise 网络请求库,作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生 node.js http 模块, 而在客户端 (浏览端) 则使用 XMLHttpRequests。

注:axios依赖原生的ES6 Promise实现。

想要完成前后端通信,在借助axios库的同时还需要遵守同源策略。同源策略是指出于安全考虑,只允许同源下的接口交互,能帮助阻隔恶意文档,减少可能被攻击的媒介。同协议、同IP、同端口视为同源。如果没有遵守同源策略,会产生跨域问题。

URL 1URL 2是否同源说明
http://www.xxx.comhttps://www.xxx.comx使用的协议不同
http://www.xxx.comhttp://www.yyy.comx使用的IP不同
http://www.xxx.com:8000http://www.xxx.com:8080x使用的端口不同
http://www.xxx.com/testhttp://www.xxx.com/dev同协议、同IP、同端口

对于前后端分离的应用,前后端分别在不同的端口运行(如前端运行在端口3000,后端运行在端口5000),必然出现跨域问题。这里选择使用代理,将指定URL请求代理到目标位置下进行处理,从而解决跨域问题。

2 步骤

2.1 配置代理

要完成前后端通信,需要解决跨域问题。因此需要配置代理。在正式部署前我们可以做简单配置。

下载http-proxy-middleware库

npm install --save-dev http-proxy-middleware

在index.js同层级下新建一个文件:setupProxy.js,具体代码如下:

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

module.exports = function (app) {
    app.use(
        createProxyMiddleware('/api', {
            target: 'http://127.0.0.1:5000',
            changeOrigin: true,
            pathRewrite: {
                '/oldPath': '/newPath',
            },
        }))
}

createProxyMiddleware部分参数含义如下表:详细内容可查看官方文档

参数名称含义示例
上下文context指定代理哪些内容:以指定开头的请求进行代理。

single:'/api'

multiple:['/api', '/test', ...]

可选项options转发的具体配置,也即怎么转发{xxx:xxx}
第二个参数 内部参数含义
target代理的目标主机,如果是本地建议使用127.0.0.1,localhost会因为xxx失败'http://127.0.0.1:5000'
changeOrigin将主机头的来源更改为目标 URL,默认是falsetrue/false
pathRewrite重写目标的url路径。如果不需要重写则可以省略。'/oldPath': '/newPath'

正式部署时,如果用的是npm run build打包并做静态部署,那么setupProxy会失效,此时需要用nginx部署前端并配置代理

 2.2 安装并导入axios库

使用npm命令下载axios库

npm install axios

可用npm list axios命令查看axios版本,这里用的是1.5.0

然后在js文件中导入

import axios from 'axios'

2.3 调用接口并处理返回数据

在完成代理配置后,我们就可以调用axios以完成前后端通信。

假设现在要发送一个post请求,传参使用form-data,并存储响应数据:

import axios from 'axios';
function Test(){
    // 用于存储接口响应
    const [data, setData] = useState({});

    useEffect(()=>{
        // 创建form-data
        const formData = new FormData();
        formData.append('start', 1);
        formData.append('end', 400);

        // 发送一个post请求
        axios.post('/path', formData)
        .then(response => {
            // 将返回的数据存入到data中
            setData(response.data);

            // 在控制台可以看到输出的data
            console.log(data);
        })
        .catch(error => {
            console.log(error);
        });
    }, []);

    return(
        // 自定义展示data
    )
}

export default Test;

GET请求同理:

import axios from 'axios';
function Test(){
    // 用于存储接口响应
    const [data, setData] = useState({});

    useEffect(()=>{

        // 发送一个get请求
        axios.get('/path')
        .then(response => {
            // 将返回的数据存入到data中
            setData(response.data);

            // 在控制台可以看到输出的data
            console.log(data);
        })
        .catch(error => {
            console.log(error);
        });
    }, []);

    return(
        // 自定义展示data
    )
}

export default Test;
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值